'From Pharo3.0 of 18 March 2013 [Latest update: #30268] on 12 July 2013 at 2:23:56 pm'! !TClass methodsFor: 'subclass creation' stamp: 'SebastianTleye 7/12/2013 14:19'! subclass: t instanceVariableNames: f classVariableNames: d poolDictionaries: s category: cat ^self explicitRequirement.! ! !TClass methodsFor: 'accessing parallel hierarchy' stamp: 'SebastianTleye 7/12/2013 14:21'! hasClassSide ^self classSide notNil.! ! !TClass methodsFor: 'subclass creation' stamp: 'SebastianTleye 7/12/2013 14:19'! subclass: t instanceVariableNames: f classVariableNames: d poolDictionaries: s category: cat ^self explicitRequirement.! ! !TClass methodsFor: 'accessing parallel hierarchy' stamp: 'SebastianTleye 7/12/2013 14:21'! hasClassSide ^self classSide notNil.! ! !TClassDescription methodsFor: 'accessing parallel hierarchy' stamp: 'SebastianTleye 7/12/2013 14:23'! hasClassSide ^self explicitRequirement.! ! !TClassDescription methodsFor: 'private' stamp: 'SebastianTleye 7/12/2013 14:16'! spaceUsed ^super spaceUsed + (self hasClassSide ifTrue: [self classSide spaceUsed] ifFalse: [0])! ! !TClassDescription methodsFor: 'accessing parallel hierarchy' stamp: 'SebastianTleye 7/12/2013 14:23'! hasClassSide ^self explicitRequirement.! ! !TClassDescription methodsFor: 'private' stamp: 'SebastianTleye 7/12/2013 14:16'! spaceUsed ^super spaceUsed + (self hasClassSide ifTrue: [self classSide spaceUsed] ifFalse: [0])! ! !TApplyingOnClassSide methodsFor: 'accessing hierarchy protocol' stamp: 'SebastianTleye 7/12/2013 14:22'! hasClassSide ^false! ! !TApplyingOnClassSide methodsFor: 'accessing hierarchy protocol' stamp: 'SebastianTleye 7/12/2013 14:22'! hasClassSide ^false! ! !ClassDescription methodsFor: 'accessing parallel hierarchy' stamp: 'SebastianTleye 7/12/2013 14:22'! hasClassSide ^self subclassResponsibility.! ! !ClassDescription methodsFor: 'accessing parallel hierarchy' stamp: 'SebastianTleye 7/12/2013 14:22'! hasClassSide ^self subclassResponsibility.! ! !Class methodsFor: 'subclass creation' stamp: 'SebastianTleye 7/12/2013 14:19'! subclass: t instanceVariableNames: f classVariableNames: d poolDictionaries: s category: cat "This is the standard initialization message for creating a new class as a subclass of an existing class (the receiver)." | class | class := self classBuilder superclass: self subclass: t instanceVariableNames: f classVariableNames: d poolDictionaries: s category: cat. class ifNotNil: [ class setTraitComposition: {} asTraitComposition ]. ^ class ! ! !Class methodsFor: 'subclass creation' stamp: 'SebastianTleye 7/12/2013 14:19'! subclass: t instanceVariableNames: f classVariableNames: d poolDictionaries: s category: cat "This is the standard initialization message for creating a new class as a subclass of an existing class (the receiver)." | class | class := self classBuilder superclass: self subclass: t instanceVariableNames: f classVariableNames: d poolDictionaries: s category: cat. class ifNotNil: [ class setTraitComposition: {} asTraitComposition ]. ^ class ! ! !TraitDescription methodsFor: 'accessing parallel hierarchy' stamp: 'SebastianTleye 7/12/2013 14:23'! hasClassSide ^self subclassResponsibility.! ! !TraitDescription methodsFor: 'accessing parallel hierarchy' stamp: 'SebastianTleye 7/12/2013 14:23'! hasClassSide ^self subclassResponsibility.! ! !Trait methodsFor: 'subclass creation' stamp: 'SebastianTleye 7/12/2013 14:19'! subclass: t instanceVariableNames: f classVariableNames: d poolDictionaries: s category: cat "Compatibility purposes" ^self error: 'Traits cannot have subclasses'.! ! !Trait methodsFor: 'subclass creation' stamp: 'SebastianTleye 7/12/2013 14:19'! subclass: t instanceVariableNames: f classVariableNames: d poolDictionaries: s category: cat "Compatibility purposes" ^self error: 'Traits cannot have subclasses'.! ! Trait removeSelector: #hasClassTrait! !Trait reorganize! (#'class name' rename:) (#'*Manifest-Core' criticTheNonMetaclassClass) (#'accessing class hierarchy' removeSubclass: addSubclass: allSubclassesWithLevelDo:startingLevel: subclassesDo:) (#copying copy duplicateClassWithNewName:) (#'*Ring-Core-Kernel' asRingDefinitionWithMethods:withSuperclasses:withSubclasses:withPackageKeys:in: asRingDefinitionWithMethods:withSuperclasses:withSubclasses:withPackages: asRingDefinition asFullRingDefinition) (#'class variables' allClassVarNames classVarNamed: removeClassVarNamed: addClassVarNamed: ensureClassPool classVarNames hasClassVarNamed: classVarNamed:put: usesClassVarNamed:) (#'*Fuel' fuelAccept:) (#viewer externalName) (#traits applyChangesOfNewTraitCompositionReplacing:) (#initialization initialize obsolete) (#'fileIn/Out' shouldFileOutPools removeFromChanges fileOutSharedPoolsOn: withClassVersion: fileOut fileOutOn:moveSource:toFile: fileOutOn:moveSource:toFile:initializing: shouldFileOutPool: hasSharedPools fileOutPool:onFileStream: fileOutInitializerOn:) (#'subclass creation' classBuilder variableSubclass:instanceVariableNames:classVariableNames:poolDictionaries:category: subclass: weakSubclass:uses:instanceVariableNames:classVariableNames:poolDictionaries:category: variableByteSubclass:instanceVariableNames:classVariableNames:poolDictionaries:category: variableSubclass:uses:instanceVariableNames:classVariableNames:poolDictionaries:category: newSubclass weakSubclass:instanceVariableNames:classVariableNames:poolDictionaries:category: subclass:instanceVariableNames: subclass:uses: subclass:instanceVariableNames:classVariableNames:poolDictionaries:category: variableByteSubclass:uses:instanceVariableNames:classVariableNames:poolDictionaries:category: variableWordSubclass:uses:instanceVariableNames:classVariableNames:poolDictionaries:category: variableWordSubclass:instanceVariableNames:classVariableNames:poolDictionaries:category: subclass:uses:instanceVariableNames:classVariableNames:poolDictionaries:category:) (#'pool variables' usesLocalPoolVarNamed: addSharedPool: sharedPoolOfVarNamed: usesPoolVarNamed: removeSharedPool: allSharedPools) (#accessing basicCategory classPoolFrom: name basicCategory: setName: environment: name: environment) (#'instance variables' removeInstVarNamed: addInstVarNamed:) (#'*GroupManagerUI' prettyName) (#testing hasAbstractMethods isObsolete hasMethods isAnonymous) (#'initialize-release' sharing: declare: superclass:methodDict:format:name:organization:instVarNames:classPool:sharedPools: removeFromSystemUnlogged unload name:traitComposition:methodDict:localSelectors:organization: superclass:methodDictionary:format: removeFromSystem removeFromSystem:) (#'*FuelTests' renameSilently:) (#private isValidTraitName: setName:andRegisterInCategory:environment:) (#'self evaluating' isSelfEvaluating) (#organization category: category) (#'*Monticello' asClassDefinition classDefinitions) (#'*Spec-Builder' subclass:category: addSourceCode:into: addInstVarNamed:type:) (#'*HelpSystem-Core' asHelpTopic) (#'accessing parallel hierarchy' classTrait isClassTrait baseTrait hasClassSide isBaseTrait classTrait:) (#'*Nautilus' nautilusIcon) (#'accessing method dictionary' addSelector:withMethod:notifying: addSelectorSilently:withMethod:) (#compiling possibleVariablesFor:continuedFrom: compileAll compile:notifying: compileAllFrom: binding innerBindingOf: bindingOf: reformatAll) ! ClassTrait removeSelector: #hasClassTrait! !ClassTrait reorganize! (#compiling compile:classified:withStamp:notifying:logSource:) (#'class hierarchy' addSubclass:) (#copying copy) (#'accessing hierarchy protocol' hasClassSide) (#composition noteNewBaseTraitCompositionApplied: assertConsistantCompositionsForNew: uses:) (#'filein/out' definition) (#'*Monticello' asMCDefinition) (#'*Fuel' fuelAccept:) (#accessing category name) (#'*refactoring-core' soleInstance includesBehavior:) (#'accessing parallel hierarchy' classTrait baseTrait: isClassTrait baseTrait isBaseTrait classTrait:) (#testing isSelfEvaluating) (#initialize baseClass:traitComposition:methodDict:localSelectors:organization: initializeFrom: initializeWithBaseTrait: traitComposition:methodDict:localSelectors:organization:) (#'*Ring-Core-Kernel' asFullRingDefinition asRingDefinition) ! TraitDescription removeSelector: #hasClassTrait! TraitDescription removeSelector: #spaceUsed! !Metaclass reorganize! ('copying' veryDeepCopyWith: postCopy) ('initialize-release' uses:instanceVariableNames: adoptInstance:from: instanceVariableNames:) ('composition' noteNewBaseTraitCompositionApplied: assertConsistantCompositionsForNew:) ('fileIn/Out' fileOutOn:moveSource:toFile:initializing: definition fileOutInitializerOn: nonTrivial fileOutOn:moveSource:toFile:) ('*Ring-Core-Kernel' asRingDefinition asFullRingDefinition) ('*NativeBoost-Core' externalTypeAlias:) ('instance creation' new) ('*Tools-Debugger' canonicalArgumentName) ('instance variables' removeInstVarNamed: addInstVarNamed:) ('accessing' hasTraitComposition environment soleInstance traitComposition: traitComposition name basicLocalSelectors basicLocalSelectors:) ('pool variables' classPool) ('class hierarchy' removeObsoleteSubclass: removeSubclass: subclasses addObsoleteSubclass: addSubclass: obsoleteSubclasses subclassesDo:) ('compiling' binding bindingOf: possibleVariablesFor:continuedFrom: wantsChangeSetLogging acceptsLoggingOfCompilation wantsRecompilationProgressReported) ('testing' isAnonymous isObsolete canZapMethodDictionary isMeta isSelfEvaluating) ('accessing parallel hierarchy' theMetaClass theNonMetaClass) (#'accessing hierarchy protocol' hasClassSide) ('*Fuel' fuelAccept:) ('accessing instances and variables' classVarNames) ('*Manifest-Core' criticTheNonMetaclassClass) ! Class removeSelector: #spaceUsed! !Class reorganize! (#viewer externalName) (#compiling possibleVariablesFor:continuedFrom: compileAll binding compile:notifying: compileAllFrom: innerBindingOf: bindingOf: reformatAll) (#'as yet unclassified' classBuilder) (#'*FuelTests' renameSilently:) (#'*Ring-Core-Kernel' asRingDefinitionWithMethods:withSuperclasses:withSubclasses:withPackageKeys:in: asRingDefinitionWithMethods:withSuperclasses:withSubclasses:withPackages: asRingDefinition asFullRingDefinition) (#'initialize-release' sharing: declare: superclass:methodDict:format:name:organization:instVarNames:classPool:sharedPools: obsolete unload removeFromSystemUnlogged name:traitComposition:methodDict:localSelectors:organization: superclass:methodDictionary:format: removeFromSystem removeFromSystem:) (#'pool variables' usesLocalPoolVarNamed: addSharedPool: sharedPoolOfVarNamed: usesPoolVarNamed: removeSharedPool: sharedPools allSharedPools sharedPools:) (#organization category: environment category environment:) (#'accessing class hierarchy' removeSubclass: addSubclass: subclasses subclasses: subclassesDo:) (#'accessing parallel hierarchy' theMetaClass theNonMetaClass hasClassSide) (#accessing basicCategory basicCategory: name traitComposition: classPool classPoolFrom: basicLocalSelectors setName: classPool: basicLocalSelectors: traitComposition) (#'class name' rename:) (#'subclass creation' subclass: variableSubclass:instanceVariableNames:classVariableNames:poolDictionaries:category: weakSubclass:uses:instanceVariableNames:classVariableNames:poolDictionaries:category: variableWordSubclass:instanceVariableNames:classVariableNames:poolDictionaries:category: variableSubclass:uses:instanceVariableNames:classVariableNames:poolDictionaries:category: newSubclass weakSubclass:instanceVariableNames:classVariableNames:poolDictionaries:category: subclass:instanceVariableNames: subclass:uses: subclass:instanceVariableNames:classVariableNames:poolDictionaries:category: variableByteSubclass:uses:instanceVariableNames:classVariableNames:poolDictionaries:category: variableWordSubclass:uses:instanceVariableNames:classVariableNames:poolDictionaries:category: subclass:uses:instanceVariableNames:classVariableNames:poolDictionaries:category: variableByteSubclass:instanceVariableNames:classVariableNames:poolDictionaries:category:) (#'accessing method dictionary' addSelector:withMethod:notifying: addSelectorSilently:withMethod:) (#traits applyChangesOfNewTraitCompositionReplacing:) (#'self evaluating' isSelfEvaluating) (#'*Spec-Builder' addSourceCode:into: addInstVarNamed:type: subclass:category:) (#'*Fuel' fuelAccept:) (#'fileIn/Out' shouldFileOutPools removeFromChanges fileOutSharedPoolsOn: withClassVersion: fileOutOn:moveSource:toFile: fileOutOn:moveSource:toFile:initializing: fileOut shouldFileOutPool: hasSharedPools fileOutPool:onFileStream: fileOutInitializerOn:) (#'*Monticello' asClassDefinition classDefinitions) (#'*GroupManagerUI' prettyName) (#'*HelpSystem-Core' asHelpTopic) (#'class variables' allClassVarNames classVarNamed: removeClassVarNamed: addClassVarNamed: ensureClassPool classVarNames hasClassVarNamed: classVarNamed:put: usesClassVarNamed:) (#'*Manifest-Core' criticTheNonMetaclassClass) (#testing hasAbstractMethods isObsolete hasMethods isAnonymous) (#'*Slot') (#copying copy duplicateClassWithNewName:) (#private isValidTraitName: name: setName:andRegisterInCategory:environment:) (#'instance variables' removeInstVarNamed: addInstVarNamed:) ! !ClassDescription reorganize! (#private notifyRepackage:method:oldProtocol:newProtocol: spaceUsed numberOfMethods setInstVarNames: errorCategoryName newInstanceFrom:variable:size:map: linesOfCode instVarMappingFrom:) (#accessing classVersion instanceVariables instanceVariables: version) (#'*Spec-Builder' compileWithoutReturn:classified:) (#authors addAuthorsTo: authors) (#'users notification' notifyUsersOfChangedSelectors: notifyUsersOfRecategorizedSelector:from:to:) (#'accessing method dictionary' addAndClassifySelector:withMethod:inProtocol:notifying: addSelectorSilently:withMethod: methodsInCategory: removeSelector: addSelector:withMethod:notifying: allMethodsInCategory: removeCategory: allMethodCategoriesIntegratedThrough: uncategorizedMethods noteAddedSelector:meta:) (#testing isTestCase) (#'filein/out' fileOutOn:moveSource:toFile: fileOutMethod:on: fileOutCategory: commentStamp:prior: printCategoryChunk:on:withStamp:priorMethod: commentStamp: fileOutChangedMessages:on: fileOutMethod: methodsFor: fileOutChangedMessages:on:moveSource:toFile: localMethods moveChangesTo: fileOutCategory:on:moveSource:toFile: classComment:stamp: definition fileOutOn: printMethodChunk:withPreamble:on:moveSource:toFile: classComment: fileOutOrganizationOn: selectorsToFileOutCategory: putClassCommentToCondensedChangesFile:) (#'accessing comment' comment: classCommentBlank hasComment comment comment:stamp:) (#'*Manifest-Core' criticNameOn: textBehavior mcWorkingCopy manifestBuilderForRuleChecker: criticClass) (#compiling compile:classified: wantsRecompilationProgressReported compileSilently:classified:notifying: instVarNamesAndOffsetsDo: compile:classified:notifying: compile:classified:withStamp:notifying:logSource: compile:classified:withStamp:notifying: doneCompiling compile:notifying: logMethodSource:forMethod:inCategory:withStamp: noteCompilationOf:meta: acceptsLoggingOfCompilation wantsChangeSetLogging reformatAll compileSilently:classified:) (#'*Slot' initializeLayoutWithSlots: layoutSized: superclass:layout: initializeLayout layout superclass:withLayoutType:slots:) (#'pool variable' usesLocalPoolVarNamed: allSharedPools usesPoolVarNamed: sharedPoolOfVarNamed: hasSharedPools) (#'organization updating' updateOrganizationDescription:oldCategory:newCategory:changedCategories: updateOrganizationSelector:oldCategory:newCategory: notifyOfRecategorizedSelector:from:to: noteRecategorizedSelectors:oldComposition: noteMethodChanged:to: noteRecategorizedSelector:from:to: applyChangesOfNewTraitCompositionReplacing: noteChangesFrom: noteMethodAdded: noteMethodRemoved: updateOrganizationDescription:oldCategory:newCategory:changed:) (#'*FuelTests' duringTestCompileSilently: duringTestCompileSilently:classified:) (#copying copyAll:from:classified: copy:from: copyCategory:from: copyCategory:from:classified: copy:from:classified: copyAll:from: copyMethodDictionaryFrom: copyAllCategoriesFrom:) (#'*Fuel' instanceVariableNamesDo:) (#'*refactoring-core-fixes' whichSelectorsReallyRead:) (#'accessing class hierarchy' commentInventory subclasses classesThatImplementAllOf: printSubclassesOn:level: subclassesDo:) (#printing storeOn: classVariablesString instanceVariablesString printOn: sharedPoolsString) (#'*rpackage-core' package isExtended isDefinedInPackage: packageOrganizer isExtendedInPackage: compileSilently: packages packagesWithoutExtensions packageFromOrganizer: extendingPackages) (#'accessing parallel hierarchy' isInstanceSide theNonMetaClass isClassSide theMetaClass instanceSide isMeta hasClassSide classSide) (#'instance variables' removeInstVarNamed: instVarIndexFor: checkForInstVarsOK: instVarNameForIndex: instVarIndexFor:ifAbsent: instVarNames classThatDefinesClassVariable: classThatDefinesInstanceVariable: allInstVarNamesEverywhere forceNewFrom: addInstVarNamed: hasInstVarNamed:) (#'*NautilusCommon' correspondingForTest) (#'*System-Support' allUnreferencedClassVariables) (#'initialize-release' updateInstances:from:isMeta: superclass:methodDictionary:format: obsolete updateInstancesFrom:) (#organization organization: zapOrganization basicOrganization: organization basicOrganization reorganize addCategory:before: whichCategoryIncludesSelector:) ! !TApplyingOnClassSide reorganize! (#composition noteNewBaseTraitCompositionApplied: assertConsistantCompositionsForNew:) (#'class hierarchy' addSubclass:) (#'*Ring-Core-Kernel' asFullRingDefinition asRingDefinition) (#'accessing hierarchy protocol' hasClassSide) ! !TClass reorganize! ('testing' hasAbstractMethods isAnonymous isObsolete hasMethods) ('accessing method dictionary' addSelectorSilently:withMethod: addSelector:withMethod:notifying:) ('self evaluating' isSelfEvaluating) ('fileIn/Out' shouldFileOutPool: fileOutOn:moveSource:toFile:initializing: hasSharedPools withClassVersion: fileOutPool:onFileStream: shouldFileOutPools fileOutInitializerOn: fileOutSharedPoolsOn: removeFromChanges fileOutOn:moveSource:toFile: fileOut) ('class variables' ensureClassPool removeClassVarNamed: usesClassVarNamed: allClassVarNames hasClassVarNamed: classVarNames classVarNamed: classVarNamed:put: addClassVarNamed:) ('class name' rename:) (#'*Spec-Builder' subclass:category: addSourceCode:into: addInstVarNamed:type:) ('copying' duplicateClassWithNewName:) ('pool variables' usesLocalPoolVarNamed: sharedPoolOfVarNamed: removeSharedPool: addSharedPool: allSharedPools usesPoolVarNamed:) ('subclass creation' variableWordSubclass:instanceVariableNames:classVariableNames:poolDictionaries:category: subclass:instanceVariableNames:classVariableNames:poolDictionaries:category: variableByteSubclass:uses:instanceVariableNames:classVariableNames:poolDictionaries:category: weakSubclass:instanceVariableNames:classVariableNames:poolDictionaries:category: subclass:uses:instanceVariableNames:classVariableNames:poolDictionaries:category: subclass:instanceVariableNames: classBuilder subclass:uses: variableByteSubclass:instanceVariableNames:classVariableNames:poolDictionaries:category: variableSubclass:instanceVariableNames:classVariableNames:poolDictionaries:category: subclass: weakSubclass:uses:instanceVariableNames:classVariableNames:poolDictionaries:category: variableSubclass:uses:instanceVariableNames:classVariableNames:poolDictionaries:category: newSubclass variableWordSubclass:uses:instanceVariableNames:classVariableNames:poolDictionaries:category:) ('organization' category category:) ('viewer' externalName) (#'*FuelTests' renameSilently:) (#'*HelpSystem-Core' asHelpTopic) ('accessing class hierarchy' subclassesDo: addSubclass: removeSubclass:) (#'*GroupManagerUI' prettyName) ('compiling' binding compile:notifying: innerBindingOf: bindingOf: possibleVariablesFor:continuedFrom: compileAllFrom: reformatAll compileAll) (#'*Manifest-Core' criticTheNonMetaclassClass) ('accessing' classPoolFrom: setName:) ('traits' applyChangesOfNewTraitCompositionReplacing:) ('initialize-release' sharing: declare: name:traitComposition:methodDict:localSelectors:organization: superclass:methodDict:format:name:organization:instVarNames:classPool:sharedPools: removeFromSystem unload obsolete superclass:methodDictionary:format: removeFromSystem: removeFromSystemUnlogged) (#'accessing parallel hierarchy' hasClassSide) ('instance variables' removeInstVarNamed: addInstVarNamed:) ('private' setName:andRegisterInCategory:environment: isValidTraitName:) ! !Trait methodsFor: 'fileIn/Out' stamp: 'SebastianTleye 7/12/2013 16:19'! fileOutOn: aFileStream moveSource: moveSource toFile: fileIndex initializing: aBool "File a description of the receiver on aFileStream. If the boolean argument, moveSource, is true, then set the trailing bytes to the position of aFileStream and to fileIndex in order to indicate where to find the source code." self crTrace: name. super fileOutOn: aFileStream moveSource: moveSource toFile: fileIndex. self hasClassSide ifTrue: [ aFileStream cr; nextPutAll: '"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!!'; cr; cr. self classTrait fileOutOn: aFileStream moveSource: moveSource toFile: fileIndex]! ! !Trait methodsFor: 'fileIn/Out' stamp: 'SebastianTleye 7/12/2013 16:19'! fileOutOn: aFileStream moveSource: moveSource toFile: fileIndex initializing: aBool "File a description of the receiver on aFileStream. If the boolean argument, moveSource, is true, then set the trailing bytes to the position of aFileStream and to fileIndex in order to indicate where to find the source code." self crTrace: name. super fileOutOn: aFileStream moveSource: moveSource toFile: fileIndex. self hasClassSide ifTrue: [ aFileStream cr; nextPutAll: '"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!!'; cr; cr. self classTrait fileOutOn: aFileStream moveSource: moveSource toFile: fileIndex]! ! !ClassTraitTest methodsFor: 'testing' stamp: 'SebastianTleye 7/12/2013 16:18'! testInitialization "self run: #testInitialization" | classTrait | classTrait := self t1 classTrait. self assert: self t1 hasClassSide. self assert: self t1 classTrait == classTrait. self assert: classTrait isClassTrait. self assert: classTrait classSide == classTrait. self deny: classTrait isBaseTrait. self assert: classTrait baseTrait == self t1. "assert classtrait methods are propagated to users when setting traitComposition" self assert: self t4 hasClassSide. self assert: self t5 hasClassSide. self assert: (self t2 classSide includesLocalSelector: #m2ClassSide:). self assert: (self t4 classSide includesSelector: #m2ClassSide:). self assert: (self t5 classSide includesSelector: #m2ClassSide:). self assert: (self c2 m2ClassSide: 17) = 17! ! !ClassTraitTest methodsFor: 'testing' stamp: 'SebastianTleye 7/12/2013 16:18'! testInitialization "self run: #testInitialization" | classTrait | classTrait := self t1 classTrait. self assert: self t1 hasClassSide. self assert: self t1 classTrait == classTrait. self assert: classTrait isClassTrait. self assert: classTrait classSide == classTrait. self deny: classTrait isBaseTrait. self assert: classTrait baseTrait == self t1. "assert classtrait methods are propagated to users when setting traitComposition" self assert: self t4 hasClassSide. self assert: self t5 hasClassSide. self assert: (self t2 classSide includesLocalSelector: #m2ClassSide:). self assert: (self t4 classSide includesSelector: #m2ClassSide:). self assert: (self t5 classSide includesSelector: #m2ClassSide:). self assert: (self c2 m2ClassSide: 17) = 17! !