MetacelloSpec.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Wed, 05 Sep 2012 16:35:54 +0000
changeset 7 759ff40b4754
parent 1 9e312de5f694
permissions -rw-r--r--
- stx_goodies_metacello_stx added: #extensionMethodNames changed: #classNamesAndAttributes #preRequisites
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
9e312de5f694 - Initial commit
jv
parents:
diff changeset
     1
"{ Package: 'stx:goodies/metacello' }"
9e312de5f694 - Initial commit
jv
parents:
diff changeset
     2
9e312de5f694 - Initial commit
jv
parents:
diff changeset
     3
Object subclass:#MetacelloSpec
9e312de5f694 - Initial commit
jv
parents:
diff changeset
     4
	instanceVariableNames:'project loader mutable'
9e312de5f694 - Initial commit
jv
parents:
diff changeset
     5
	classVariableNames:''
9e312de5f694 - Initial commit
jv
parents:
diff changeset
     6
	poolDictionaries:''
9e312de5f694 - Initial commit
jv
parents:
diff changeset
     7
	category:'Metacello-Core-Specs'
9e312de5f694 - Initial commit
jv
parents:
diff changeset
     8
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
     9
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    10
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    11
!MetacelloSpec class methodsFor:'instance creation'!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    12
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    13
for: aVersionMap
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    14
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    15
	^(self platformClass new)
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    16
		for: aVersionMap;
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    17
		yourself
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    18
! !
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    19
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    20
!MetacelloSpec class methodsFor:'accessing'!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    21
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    22
platformClass
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    23
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    24
	^self
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    25
! !
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    26
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    27
!MetacelloSpec methodsFor:'accessing'!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    28
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    29
loader
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    30
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    31
	loader == nil 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    32
		ifTrue: [ | prjctLoader |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    33
			(prjctLoader := self project loader) == nil
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    34
				ifTrue: [ self loader: (self project loaderClass on: self) ]
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    35
				ifFalse: [ self loader: prjctLoader ]].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    36
	^loader
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    37
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    38
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    39
loader: aLoader
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    40
    "We're interested in propogating the loader state, _except_ for the spec"
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    41
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    42
    self shouldBeMutable.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    43
    loader := aLoader copy.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    44
    loader spec: self
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    45
! !
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    46
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    47
!MetacelloSpec methodsFor:'copying'!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    48
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    49
postCopy
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    50
    super postCopy.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    51
    mutable := nil.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    52
    loader ~~ nil
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    53
        ifTrue: [ self loader: loader ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    54
! !
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    55
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    56
!MetacelloSpec methodsFor:'doits'!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    57
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    58
doItBlock: selector
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    59
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    60
	selector == nil ifTrue: [ ^nil ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    61
	selector numArgs = 0
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    62
		ifTrue: [ ^[ self project configuration perform: selector ] ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    63
	selector numArgs = 1
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    64
		ifTrue: [ ^[:aLoader | self project configuration perform: selector with: aLoader ] ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    65
	selector numArgs = 2
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    66
		ifTrue: [ ^[:aLoader :pkgSpec | self project configuration perform: selector with: aLoader with: pkgSpec ] ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    67
	^nil
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    68
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    69
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    70
postLoadDoIt
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    71
	"noop unless non-nil value returned"
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    72
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    73
	^nil
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    74
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    75
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    76
postLoadDoItBlock
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    77
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    78
	^self doItBlock: self postLoadDoIt value
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    79
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    80
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    81
preLoadDoIt
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    82
	"noop unless non-nil value returned"
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    83
	
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    84
	^nil
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    85
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    86
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    87
preLoadDoItBlock
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    88
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    89
	^self doItBlock: self preLoadDoIt value
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    90
! !
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    91
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    92
!MetacelloSpec methodsFor:'importing'!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    93
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    94
mergeImportLoads: aLoadList
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    95
    self error: 'import: can only be used with baseline project specs'
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    96
! !
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    97
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    98
!MetacelloSpec methodsFor:'initialization'!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    99
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   100
for: aProject
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   101
    self shouldBeMutable.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   102
    project := aProject
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   103
! !
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   104
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   105
!MetacelloSpec methodsFor:'merging'!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   106
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   107
aboutToCopy
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   108
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   109
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   110
mergeMap
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   111
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   112
	^Dictionary new.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   113
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   114
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   115
mergeSpec: aSpec
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   116
    | newSpec nonOverridable |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   117
    self validateMergeForSpec: aSpec.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   118
    newSpec := self copy.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   119
    nonOverridable := self nonOverridable.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   120
    aSpec mergeMap
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   121
        keysAndValuesDo: [ :key :value | 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   122
            (nonOverridable includes: key)
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   123
                ifFalse: [ 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   124
                    value ~~ nil
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   125
                        ifTrue: [ newSpec instVarNamed: key asString put: value ] ] ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   126
    ^ newSpec
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   127
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   128
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   129
nonOverridable
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   130
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   131
	^#()
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   132
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   133
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   134
validateMergeForSpec: aSpec
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   135
    aSpec class = self class
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   136
        ifFalse: [ 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   137
            self
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   138
                error:
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   139
                    'The project spec ' , self name printString , ' in project ' , self project label , ' has incompatible specs. '
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   140
                        , aSpec class name asString , ' and ' , self class name asString , ' are not compatible.' ]
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   141
! !
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   142
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   143
!MetacelloSpec methodsFor:'mutability'!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   144
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   145
copyOnWrite: aBlock
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   146
    "assume that only registered projects are immutable ... otherwise you'll get an error"
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   147
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   148
    | copy |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   149
    copy := self copy.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   150
    aBlock value: copy.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   151
    ^ copy
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   152
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   153
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   154
immutable
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   155
    mutable := false
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   156
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   157
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   158
isMutable
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   159
    mutable ifNil: [ ^ true ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   160
    ^ mutable
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   161
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   162
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   163
mutable
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   164
    mutable := true
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   165
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   166
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   167
shouldBeMutable
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   168
    self isMutable
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   169
        ifTrue: [ ^ self ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   170
    self error: 'Not allowed to modify an immutable object'
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   171
! !
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   172
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   173
!MetacelloSpec methodsFor:'printing'!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   174
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   175
configMethodOn: aStream
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   176
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   177
	self configMethodOn: aStream indent: 0
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   178
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   179
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   180
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   181
configMethodOn: aStream indent: indent
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   182
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   183
	self subclassResponsibility
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   184
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   185
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   186
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   187
label
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   188
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   189
	^self printString
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   190
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   191
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   192
printOn: aStream
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   193
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   194
	self configMethodOn: aStream indent: 0
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   195
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   196
! !
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   197
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   198
!MetacelloSpec methodsFor:'querying'!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   199
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   200
answers
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   201
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   202
	^#()
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   203
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   204
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   205
project
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   206
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   207
	^project
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   208
! !
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   209
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   210
!MetacelloSpec methodsFor:'spec creation'!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   211
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   212
addMember
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   213
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   214
	^MetacelloAddMemberSpec for: self project
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   215
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   216
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   217
copyMember
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   218
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   219
	^MetacelloCopyMemberSpec for: self project
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   220
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   221
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   222
mergeMember
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   223
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   224
	^MetacelloMergeMemberSpec for: self project
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   225
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   226
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   227
removeMember
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   228
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   229
	^MetacelloRemoveMemberSpec for: self project
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   230
! !
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   231
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   232
!MetacelloSpec class methodsFor:'documentation'!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   233
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   234
version_SVN
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   235
    ^ '$Id::                                                                                                                        $'
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   236
! !