|  | @@ -394,38 +394,44 @@ ClassBuilder is responsible for compiling new classes or modifying existing clas
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  Rather than using ClassBuilder directly to compile a class, use `Class >> subclass:instanceVariableNames:package:`.!
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -!ClassBuilder methodsFor: 'api'!
 | 
	
		
			
				|  |  | +!ClassBuilder methodsFor: 'accessing'!
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -class: aClass instanceVariableNames: aString
 | 
	
		
			
				|  |  | -	self basicClass: aClass instanceVariableNames: aString.
 | 
	
		
			
				|  |  | -    self setupClass: aClass.
 | 
	
		
			
				|  |  | +instanceVariableNamesFor: aString
 | 
	
		
			
				|  |  | +	^(aString tokenize: ' ') reject: [ :each | each isEmpty ]
 | 
	
		
			
				|  |  | +! !
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +!ClassBuilder methodsFor: 'class definition'!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +addSubclassOf: aClass named: aString instanceVariableNames: aCollection package: packageName
 | 
	
		
			
				|  |  | +    | theClass |
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  | -    SystemAnnouncer current
 | 
	
		
			
				|  |  | -    	announce: (ClassDefinitionChanged new
 | 
	
		
			
				|  |  | -        	theClass: aClass;
 | 
	
		
			
				|  |  | -            yourself)
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | +    theClass := Smalltalk current at: aString.
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +   	theClass ifNotNil: [ 
 | 
	
		
			
				|  |  | +    	theClass superclass == aClass ifFalse: [
 | 
	
		
			
				|  |  | +    		^ self 
 | 
	
		
			
				|  |  | +        		migrateClassNamed: aString 
 | 
	
		
			
				|  |  | +           	 	superclass: aClass 
 | 
	
		
			
				|  |  | +           	 	instanceVariableNames: aCollection 
 | 
	
		
			
				|  |  | +            	package: packageName ] ].
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -installMethod: aCompiledMethod forClass: aBehavior category: aString
 | 
	
		
			
				|  |  | -	aCompiledMethod category: aString.
 | 
	
		
			
				|  |  | -	aBehavior addCompiledMethod: aCompiledMethod.
 | 
	
		
			
				|  |  | -    self setupClass: aBehavior.
 | 
	
		
			
				|  |  | -	^aCompiledMethod
 | 
	
		
			
				|  |  | +	^ self 
 | 
	
		
			
				|  |  | +    	basicAddSubclassOf: aClass 
 | 
	
		
			
				|  |  | +        named: aString 
 | 
	
		
			
				|  |  | +        instanceVariableNames: aCollection 
 | 
	
		
			
				|  |  | +        package: packageName
 | 
	
		
			
				|  |  |  !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -renameClass: aClass to: aString
 | 
	
		
			
				|  |  | -	self basicRenameClass: aClass to: aString.
 | 
	
		
			
				|  |  | +class: aClass instanceVariableNames: aString
 | 
	
		
			
				|  |  | +	self basicClass: aClass instanceVariableNames: aString.
 | 
	
		
			
				|  |  | +    self setupClass: aClass.
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  |      SystemAnnouncer current
 | 
	
		
			
				|  |  | -    	announce: (ClassRenamed new
 | 
	
		
			
				|  |  | +    	announce: (ClassDefinitionChanged new
 | 
	
		
			
				|  |  |          	theClass: aClass;
 | 
	
		
			
				|  |  |              yourself)
 | 
	
		
			
				|  |  |  !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -setupClass: aClass
 | 
	
		
			
				|  |  | -	<smalltalk.init(aClass);>
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  superclass: aClass subclass: aString
 | 
	
		
			
				|  |  |  	^self superclass: aClass subclass: aString instanceVariableNames: '' package: nil
 | 
	
		
			
				|  |  |  !
 | 
	
	
		
			
				|  | @@ -446,64 +452,60 @@ superclass: aClass subclass: aString instanceVariableNames: aString2 package: aS
 | 
	
		
			
				|  |  |  	^newClass
 | 
	
		
			
				|  |  |  ! !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -!ClassBuilder methodsFor: 'private'!
 | 
	
		
			
				|  |  | +!ClassBuilder methodsFor: 'class migration'!
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -addSubclassOf: aClass named: aString instanceVariableNames: aCollection package: packageName
 | 
	
		
			
				|  |  | -    | theClass |
 | 
	
		
			
				|  |  | +migrateClass: aClass superclass: anotherClass
 | 
	
		
			
				|  |  | +	console log: aClass name.
 | 
	
		
			
				|  |  | +	self 
 | 
	
		
			
				|  |  | +    	migrateClassNamed: aClass name
 | 
	
		
			
				|  |  | +        superclass: anotherClass
 | 
	
		
			
				|  |  | +        instanceVariableNames: aClass instanceVariableNames
 | 
	
		
			
				|  |  | +        package: aClass package name
 | 
	
		
			
				|  |  | +!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +migrateClassNamed: aString superclass: aClass instanceVariableNames: aCollection package: packageName
 | 
	
		
			
				|  |  | +	| oldClass newClass tmp |
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  | -    theClass := Smalltalk current at: aString.
 | 
	
		
			
				|  |  | +    tmp := 'new*', aString.
 | 
	
		
			
				|  |  | +    oldClass := Smalltalk current at: aString.
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  | -   	theClass ifNotNil: [ 
 | 
	
		
			
				|  |  | -    	theClass superclass == aClass ifFalse: [
 | 
	
		
			
				|  |  | -    		^ self 
 | 
	
		
			
				|  |  | -        		migrateClassNamed: aString 
 | 
	
		
			
				|  |  | -           	 	superclass: aClass 
 | 
	
		
			
				|  |  | -           	 	instanceVariableNames: aCollection 
 | 
	
		
			
				|  |  | -            	package: packageName ] ].
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	^ self 
 | 
	
		
			
				|  |  | -    	basicAddSubclassOf: aClass 
 | 
	
		
			
				|  |  | -        named: aString 
 | 
	
		
			
				|  |  | -        instanceVariableNames: aCollection 
 | 
	
		
			
				|  |  | -        package: packageName
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | +    newClass := self 
 | 
	
		
			
				|  |  | +		addSubclassOf: aClass
 | 
	
		
			
				|  |  | +		named: tmp
 | 
	
		
			
				|  |  | +		instanceVariableNames: aCollection
 | 
	
		
			
				|  |  | +		package: packageName.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -basicAddSubclassOf: aClass named: aString instanceVariableNames: aCollection package: packageName
 | 
	
		
			
				|  |  | -	<
 | 
	
		
			
				|  |  | -		smalltalk.addClass(aString, aClass, aCollection, packageName);
 | 
	
		
			
				|  |  | -		return smalltalk[aString]
 | 
	
		
			
				|  |  | -	>
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | +	self basicSwapClassNames: oldClass with: newClass.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -basicClass: aClass instanceVariableNames: aString
 | 
	
		
			
				|  |  | -	self basicClass: aClass instanceVariables: (self instanceVariableNamesFor: aString)
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | +	[ self copyClass: oldClass to: newClass ]
 | 
	
		
			
				|  |  | +		on: Error
 | 
	
		
			
				|  |  | +		do: [ :exception |
 | 
	
		
			
				|  |  | +			self
 | 
	
		
			
				|  |  | +            	basicSwapClassNames: oldClass with: newClass;
 | 
	
		
			
				|  |  | +            	basicRemoveClass: newClass.
 | 
	
		
			
				|  |  | +            exception signal ].
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -basicClass: aClass instanceVariables: aCollection
 | 
	
		
			
				|  |  | +	self
 | 
	
		
			
				|  |  | +		rawRenameClass: oldClass to: tmp;
 | 
	
		
			
				|  |  | +        rawRenameClass: newClass to: aString.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	aClass isMetaclass ifFalse: [self error: aClass name, ' is not a metaclass'].
 | 
	
		
			
				|  |  | -	aClass basicAt: 'iVarNames' put: aCollection
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | +	oldClass subclasses do: [ :each |
 | 
	
		
			
				|  |  | +    	self migrateClass: each superclass: newClass ].
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -basicRemoveClass: aClass
 | 
	
		
			
				|  |  | -	<smalltalk.removeClass(aClass)>
 | 
	
		
			
				|  |  | +    self basicRemoveClass: oldClass.
 | 
	
		
			
				|  |  | +	^newClass
 | 
	
		
			
				|  |  |  !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -basicRenameClass: aClass to: aString
 | 
	
		
			
				|  |  | -	<
 | 
	
		
			
				|  |  | -		smalltalk[aString] = aClass;
 | 
	
		
			
				|  |  | -		delete smalltalk[aClass.className];
 | 
	
		
			
				|  |  | -		aClass.className = aString;
 | 
	
		
			
				|  |  | -	>
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | +renameClass: aClass to: aString
 | 
	
		
			
				|  |  | +	self basicRenameClass: aClass to: aString.
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    SystemAnnouncer current
 | 
	
		
			
				|  |  | +    	announce: (ClassRenamed new
 | 
	
		
			
				|  |  | +        	theClass: aClass;
 | 
	
		
			
				|  |  | +            yourself)
 | 
	
		
			
				|  |  | +! !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -basicSwapClassNames: aClass with: anotherClass
 | 
	
		
			
				|  |  | -	<
 | 
	
		
			
				|  |  | -		var tmp = aClass.className;
 | 
	
		
			
				|  |  | -		aClass.className = anotherClass.className;
 | 
	
		
			
				|  |  | -        anotherClass.className = tmp;
 | 
	
		
			
				|  |  | -	>
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | +!ClassBuilder methodsFor: 'copying'!
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  copyClass: aClass named: aString
 | 
	
		
			
				|  |  |  	| newClass |
 | 
	
	
		
			
				|  | @@ -532,52 +534,54 @@ copyClass: aClass to: anotherClass
 | 
	
		
			
				|  |  |  		Compiler new install: each source forClass: anotherClass class category: each category ].
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	self setupClass: anotherClass
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | +! !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -instanceVariableNamesFor: aString
 | 
	
		
			
				|  |  | -	^(aString tokenize: ' ') reject: [ :each | each isEmpty ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | +!ClassBuilder methodsFor: 'method definition'!
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -migrateClass: aClass superclass: anotherClass
 | 
	
		
			
				|  |  | -	console log: aClass name.
 | 
	
		
			
				|  |  | -	self 
 | 
	
		
			
				|  |  | -    	migrateClassNamed: aClass name
 | 
	
		
			
				|  |  | -        superclass: anotherClass
 | 
	
		
			
				|  |  | -        instanceVariableNames: aClass instanceVariableNames
 | 
	
		
			
				|  |  | -        package: aClass package name
 | 
	
		
			
				|  |  | +installMethod: aCompiledMethod forClass: aBehavior category: aString
 | 
	
		
			
				|  |  | +	aCompiledMethod category: aString.
 | 
	
		
			
				|  |  | +	aBehavior addCompiledMethod: aCompiledMethod.
 | 
	
		
			
				|  |  | +    self setupClass: aBehavior.
 | 
	
		
			
				|  |  | +	^aCompiledMethod
 | 
	
		
			
				|  |  | +! !
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +!ClassBuilder methodsFor: 'private'!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +basicAddSubclassOf: aClass named: aString instanceVariableNames: aCollection package: packageName
 | 
	
		
			
				|  |  | +	<
 | 
	
		
			
				|  |  | +		smalltalk.addClass(aString, aClass, aCollection, packageName);
 | 
	
		
			
				|  |  | +		return smalltalk[aString]
 | 
	
		
			
				|  |  | +	>
 | 
	
		
			
				|  |  |  !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -migrateClassNamed: aString superclass: aClass instanceVariableNames: aCollection package: packageName
 | 
	
		
			
				|  |  | -	| oldClass newClass tmp |
 | 
	
		
			
				|  |  | -    
 | 
	
		
			
				|  |  | -    tmp := 'new*', aString.
 | 
	
		
			
				|  |  | -    oldClass := Smalltalk current at: aString.
 | 
	
		
			
				|  |  | -    
 | 
	
		
			
				|  |  | -    newClass := self 
 | 
	
		
			
				|  |  | -		addSubclassOf: aClass
 | 
	
		
			
				|  |  | -		named: tmp
 | 
	
		
			
				|  |  | -		instanceVariableNames: aCollection
 | 
	
		
			
				|  |  | -		package: packageName.
 | 
	
		
			
				|  |  | +basicClass: aClass instanceVariableNames: aString
 | 
	
		
			
				|  |  | +	self basicClass: aClass instanceVariables: (self instanceVariableNamesFor: aString)
 | 
	
		
			
				|  |  | +!
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	self basicSwapClassNames: oldClass with: newClass.
 | 
	
		
			
				|  |  | +basicClass: aClass instanceVariables: aCollection
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	[ self copyClass: oldClass to: newClass ]
 | 
	
		
			
				|  |  | -		on: Error
 | 
	
		
			
				|  |  | -		do: [ :exception |
 | 
	
		
			
				|  |  | -			self
 | 
	
		
			
				|  |  | -            	basicSwapClassNames: oldClass with: newClass;
 | 
	
		
			
				|  |  | -            	basicRemoveClass: newClass.
 | 
	
		
			
				|  |  | -            exception signal ].
 | 
	
		
			
				|  |  | +	aClass isMetaclass ifFalse: [self error: aClass name, ' is not a metaclass'].
 | 
	
		
			
				|  |  | +	aClass basicAt: 'iVarNames' put: aCollection
 | 
	
		
			
				|  |  | +!
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	self
 | 
	
		
			
				|  |  | -		rawRenameClass: oldClass to: tmp;
 | 
	
		
			
				|  |  | -        rawRenameClass: newClass to: aString.
 | 
	
		
			
				|  |  | +basicRemoveClass: aClass
 | 
	
		
			
				|  |  | +	<smalltalk.removeClass(aClass)>
 | 
	
		
			
				|  |  | +!
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	oldClass subclasses do: [ :each |
 | 
	
		
			
				|  |  | -    	self migrateClass: each superclass: newClass ].
 | 
	
		
			
				|  |  | +basicRenameClass: aClass to: aString
 | 
	
		
			
				|  |  | +	<
 | 
	
		
			
				|  |  | +		smalltalk[aString] = aClass;
 | 
	
		
			
				|  |  | +		delete smalltalk[aClass.className];
 | 
	
		
			
				|  |  | +		aClass.className = aString;
 | 
	
		
			
				|  |  | +	>
 | 
	
		
			
				|  |  | +!
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    self basicRemoveClass: oldClass.
 | 
	
		
			
				|  |  | -	^newClass
 | 
	
		
			
				|  |  | +basicSwapClassNames: aClass with: anotherClass
 | 
	
		
			
				|  |  | +	<
 | 
	
		
			
				|  |  | +		var tmp = aClass.className;
 | 
	
		
			
				|  |  | +		aClass.className = anotherClass.className;
 | 
	
		
			
				|  |  | +        anotherClass.className = tmp;
 | 
	
		
			
				|  |  | +	>
 | 
	
		
			
				|  |  |  !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  rawRenameClass: aClass to: aString
 | 
	
	
		
			
				|  | @@ -586,6 +590,12 @@ rawRenameClass: aClass to: aString
 | 
	
		
			
				|  |  |  	>
 | 
	
		
			
				|  |  |  ! !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +!ClassBuilder methodsFor: 'public'!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +setupClass: aClass
 | 
	
		
			
				|  |  | +	<smalltalk.init(aClass);>
 | 
	
		
			
				|  |  | +! !
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  Object subclass: #ClassCategoryReader
 | 
	
		
			
				|  |  |  	instanceVariableNames: 'class category'
 | 
	
		
			
				|  |  |  	package: 'Kernel-Classes'!
 |