I had a look at tweaking MaReadStrategy with the idea of being able to specify a default depth for attributes that do not have explicitly defined depths since it is currently 0.
This is what I came up with:
Store the default depth in the depthSpecifications as an association with with no value.
onAny: aClass readToDepth: anInteger
^depthSpecifications at: aClass ifAbsentPut: [ Association key:
anInteger value: nil ].
Store the specific depths for attributes in a dictionary in the Association value.
forVariableNamed: aString onAny: aClass readToDepth: anInteger
| specs |
(aClass allInstVarNames includes: aString) ifFalse: [ MagmaUserError signal: aString , ' is not an attribute
of ' , aClass name ].
specs := depthSpecifications at: aClass ifAbsent: [ self onAny: aClass
readToDepth: 0 ].
specs value ifNil: [ specs value: (self depthDictionaryOfSize: aClass
instSize) ].
specs value at: aString put: anInteger
Update the code that uses this datastructure.
instVarMapFor: aMaClassDefinition "Answer an Array with an instVarMap of aMaClassDefinition
according to
user-declared read depths."
| specifiedDepths answer | (aMaClassDefinition isDefined and: [ depthSpecifications includesKey: aMaClassDefinition
classObject ])
ifTrue: [ specifiedDepths _ depthSpecifications at:
aMaClassDefinition classObject.
specifiedDepths value ifNil: [ answer _ specifiedDepths key ] ifNotNil: [ answer _ self depthArrayOfSize:
aMaClassDefinition namedInstSize >default: specifiedDepths key.
specifiedDepths value keysAndValuesDo: [ : eachInstVarName : eachDepth | answer at: (aMaClassDefinition allInstVarNames
indexOf: eachInstVarName)
put: eachDepth ] ] ].
^ answer
I dont know whether this scheme is as efficient as it could be, but it seemed to me that filling the depthArray with the given default value would be the best answer here.
any thoughts?
Keith
___________________________________________________________ Now you can scan emails quickly with a reading pane. Get the new Yahoo! Mail. http://uk.docs.yahoo.com/nowyoucan.html