浏览代码

More meta protocol for packages in Smalltalk and some cleanups of old modules code.

Göran Krampe 13 年之前
父节点
当前提交
3d596a2c6e
共有 3 个文件被更改,包括 218 次插入234 次删除
  1. 40 65
      js/Kernel.deploy.js
  2. 78 113
      js/Kernel.js
  3. 100 56
      st/Kernel.st

+ 40 - 65
js/Kernel.deploy.js

@@ -659,23 +659,56 @@ return self;}
 smalltalk.Smalltalk);
 
 smalltalk.addMethod(
-'_modules',
+'_packages',
 smalltalk.method({
-selector: 'modules',
+selector: 'packages',
 fn: function (){
 var self=this;
-return self.modules.all();
+return self.packages.all();
 return self;}
 }),
 smalltalk.Smalltalk);
 
 smalltalk.addMethod(
-'_packages',
+'_packageAt_',
 smalltalk.method({
-selector: 'packages',
-fn: function (){
+selector: 'packageAt:',
+fn: function (packageName){
 var self=this;
-return self.packages.all();
+return self.packages[packageName];
+return self;}
+}),
+smalltalk.Smalltalk);
+
+smalltalk.addMethod(
+'_packageAt_ifAbsent_',
+smalltalk.method({
+selector: 'packageAt:ifAbsent:',
+fn: function (packageName, aBlock){
+var self=this;
+return smalltalk.send(smalltalk.send(self, "_packageAt_", [packageName]), "_ifNil_", [aBlock]);
+return self;}
+}),
+smalltalk.Smalltalk);
+
+smalltalk.addMethod(
+'_createPackage_',
+smalltalk.method({
+selector: 'createPackage:',
+fn: function (packageName){
+var self=this;
+return smalltalk.addPackage(packageName);
+return self;}
+}),
+smalltalk.Smalltalk);
+
+smalltalk.addMethod(
+'_deletePackage_',
+smalltalk.method({
+selector: 'deletePackage:',
+fn: function (packageName){
+var self=this;
+delete smalltalk.packages[packageName];
 return self;}
 }),
 smalltalk.Smalltalk);
@@ -1114,28 +1147,6 @@ return self;}
 }),
 smalltalk.Class);
 
-smalltalk.addMethod(
-'_module',
-smalltalk.method({
-selector: 'module',
-fn: function (){
-var self=this;
-return self.module;
-return self;}
-}),
-smalltalk.Class);
-
-smalltalk.addMethod(
-'_module_',
-smalltalk.method({
-selector: 'module:',
-fn: function (aModule){
-var self=this;
-self.module = aModule;
-return self;}
-}),
-smalltalk.Class);
-
 smalltalk.addMethod(
 '_subclass_instanceVariableNames_module_',
 smalltalk.method({
@@ -4431,42 +4442,6 @@ smalltalk.MethodContext);
 
 
 
-smalltalk.addClass('Module', smalltalk.Object, [], 'Kernel');
-smalltalk.addMethod(
-'_name',
-smalltalk.method({
-selector: 'name',
-fn: function (){
-var self=this;
-return self.moduleName || nil;
-return self;}
-}),
-smalltalk.Module);
-
-smalltalk.addMethod(
-'_requires',
-smalltalk.method({
-selector: 'requires',
-fn: function (){
-var self=this;
-return self.requires || nil;
-return self;}
-}),
-smalltalk.Module);
-
-smalltalk.addMethod(
-'_name_',
-smalltalk.method({
-selector: 'name:',
-fn: function (aString){
-var self=this;
-return self.moduleName = aString;
-return self;}
-}),
-smalltalk.Module);
-
-
-
 smalltalk.addClass('Association', smalltalk.Object, ['key', 'value'], 'Kernel');
 smalltalk.addMethod(
 '__eq',

+ 78 - 113
js/Kernel.js

@@ -187,7 +187,7 @@ return self;},
 args: ["anObject"],
 source: unescape('-%3E%20anObject%0A%09%5EAssociation%20key%3A%20self%20value%3A%20anObject'),
 messageSends: ["key:value:"],
-referencedClasses: [smalltalk.Association]
+referencedClasses: [smalltalk.nil]
 }),
 smalltalk.Object);
 
@@ -683,7 +683,7 @@ return self;},
 args: ["aMessage"],
 source: unescape('doesNotUnderstand%3A%20aMessage%0A%09MessageNotUnderstood%20new%0A%09%09receiver%3A%20self%3B%0A%09%09message%3A%20aMessage%3B%0A%09%09signal'),
 messageSends: ["receiver:", "message:", "signal", "new"],
-referencedClasses: [smalltalk.MessageNotUnderstood]
+referencedClasses: [smalltalk.nil]
 }),
 smalltalk.Object);
 
@@ -939,32 +939,80 @@ referencedClasses: [smalltalk.String,smalltalk.Error]
 smalltalk.Smalltalk);
 
 smalltalk.addMethod(
-'_modules',
+'_packages',
 smalltalk.method({
-selector: 'modules',
-category: 'accessing',
+selector: 'packages',
+category: 'packages',
 fn: function (){
 var self=this;
-return self.modules.all();
+return self.packages.all();
 return self;},
 args: [],
-source: unescape('modules%0A%09%3Creturn%20self.modules.all%28%29%3E'),
+source: unescape('packages%0A%09%3Creturn%20self.packages.all%28%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
 smalltalk.Smalltalk);
 
 smalltalk.addMethod(
-'_packages',
+'_packageAt_',
 smalltalk.method({
-selector: 'packages',
-category: 'accessing',
-fn: function (){
+selector: 'packageAt:',
+category: 'packages',
+fn: function (packageName){
 var self=this;
-return self.packages.all();
+return self.packages[packageName];
 return self;},
-args: [],
-source: unescape('packages%0A%09%3Creturn%20self.packages.all%28%29%3E'),
+args: ["packageName"],
+source: unescape('packageAt%3A%20packageName%0A%20%20%20%20%20%20%20%3Creturn%20self.packages%5BpackageName%5D%3E'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.Smalltalk);
+
+smalltalk.addMethod(
+'_packageAt_ifAbsent_',
+smalltalk.method({
+selector: 'packageAt:ifAbsent:',
+category: 'packages',
+fn: function (packageName, aBlock){
+var self=this;
+return smalltalk.send(smalltalk.send(self, "_packageAt_", [packageName]), "_ifNil_", [aBlock]);
+return self;},
+args: ["packageName", "aBlock"],
+source: unescape('packageAt%3A%20packageName%20ifAbsent%3A%20aBlock%0A%20%20%20%20%20%20%20%5E%28self%20packageAt%3A%20packageName%29%20ifNil%3A%20aBlock'),
+messageSends: ["ifNil:", "packageAt:"],
+referencedClasses: []
+}),
+smalltalk.Smalltalk);
+
+smalltalk.addMethod(
+'_createPackage_',
+smalltalk.method({
+selector: 'createPackage:',
+category: 'packages',
+fn: function (packageName){
+var self=this;
+return smalltalk.addPackage(packageName);
+return self;},
+args: ["packageName"],
+source: unescape('createPackage%3A%20packageName%0A%20%20%20%20%20%20%20%3Creturn%20smalltalk.addPackage%28packageName%29%3E'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.Smalltalk);
+
+smalltalk.addMethod(
+'_deletePackage_',
+smalltalk.method({
+selector: 'deletePackage:',
+category: 'packages',
+fn: function (packageName){
+var self=this;
+delete smalltalk.packages[packageName];
+return self;},
+args: ["packageName"],
+source: unescape('deletePackage%3A%20packageName%0A%20%20%20%20%20%20%20%3Cdelete%20smalltalk.packages%5BpackageName%5D%3E'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -1207,7 +1255,7 @@ return self;},
 args: ["aString"],
 source: unescape('methodsFor%3A%20aString%0A%09%5EClassCategoryReader%20new%0A%09%20%20%20%20class%3A%20self%20category%3A%20aString%3B%0A%09%20%20%20%20yourself'),
 messageSends: ["class:category:", "yourself", "new"],
-referencedClasses: [smalltalk.ClassCategoryReader]
+referencedClasses: [smalltalk.nil]
 }),
 smalltalk.Behavior);
 
@@ -1287,7 +1335,7 @@ return self;},
 args: [],
 source: unescape('commentStamp%0A%20%20%20%20%5EClassCommentReader%20new%0A%09class%3A%20self%3B%0A%09yourself'),
 messageSends: ["class:", "yourself", "new"],
-referencedClasses: [smalltalk.ClassCommentReader]
+referencedClasses: [smalltalk.nil]
 }),
 smalltalk.Behavior);
 
@@ -1359,7 +1407,7 @@ return self;},
 args: ["aBlock"],
 source: unescape('protocolsDo%3A%20aBlock%0A%09%22Execute%20aBlock%20for%20each%20method%20category%20with%0A%09its%20collection%20of%20methods%20in%20the%20sort%20order%20of%20category%20name.%22%0A%0A%09%7C%20methodsByCategory%20%7C%0A%09methodsByCategory%20%3A%3D%20Dictionary%20new.%0A%09self%20methodDictionary%20values%20do%3A%20%5B%3Am%20%7C%0A%09%09%28methodsByCategory%20at%3A%20m%20category%20ifAbsentPut%3A%20%5BArray%20new%5D%29%0A%20%09%09%09add%3A%20m%5D.%20%0A%09self%20protocols%20do%3A%20%5B%3Acategory%20%7C%0A%09%09aBlock%20value%3A%20category%20value%3A%20%28methodsByCategory%20at%3A%20category%29%5D'),
 messageSends: ["new", "do:", "values", "methodDictionary", "add:", "at:ifAbsentPut:", "category", "protocols", "value:value:", "at:"],
-referencedClasses: [smalltalk.Dictionary,smalltalk.Array]
+referencedClasses: [smalltalk.nil,smalltalk.Array]
 }),
 smalltalk.Behavior);
 
@@ -1461,7 +1509,7 @@ return self;},
 args: ["aString", "anotherString"],
 source: unescape('compile%3A%20aString%20category%3A%20anotherString%0A%09%7C%20method%20%7C%0A%09method%20%3A%3D%20Compiler%20new%20load%3A%20aString%20forClass%3A%20self.%0A%09method%20category%3A%20anotherString.%0A%09self%20addCompiledMethod%3A%20method'),
 messageSends: ["load:forClass:", "new", "category:", "addCompiledMethod:"],
-referencedClasses: [smalltalk.Compiler]
+referencedClasses: [smalltalk.nil]
 }),
 smalltalk.Behavior);
 
@@ -1584,38 +1632,6 @@ referencedClasses: []
 }),
 smalltalk.Class);
 
-smalltalk.addMethod(
-'_module',
-smalltalk.method({
-selector: 'module',
-category: 'accessing',
-fn: function (){
-var self=this;
-return self.module;
-return self;},
-args: [],
-source: unescape('module%0A%09%3Creturn%20self.module%3E'),
-messageSends: [],
-referencedClasses: []
-}),
-smalltalk.Class);
-
-smalltalk.addMethod(
-'_module_',
-smalltalk.method({
-selector: 'module:',
-category: 'accessing',
-fn: function (aModule){
-var self=this;
-self.module = aModule;
-return self;},
-args: ["aModule"],
-source: unescape('module%3A%20aModule%0A%09%3Cself.module%20%3D%20aModule%3E'),
-messageSends: [],
-referencedClasses: []
-}),
-smalltalk.Class);
-
 smalltalk.addMethod(
 '_subclass_instanceVariableNames_module_',
 smalltalk.method({
@@ -1676,7 +1692,7 @@ return self;},
 args: ["aString", "aString2", "aString3"],
 source: unescape('subclass%3A%20aString%20instanceVariableNames%3A%20aString2%20package%3A%20aString3%0A%09%5EClassBuilder%20new%0A%09%20%20%20%20superclass%3A%20self%20subclass%3A%20aString%20instanceVariableNames%3A%20aString2%20package%3A%20aString3'),
 messageSends: ["superclass:subclass:instanceVariableNames:package:", "new"],
-referencedClasses: [smalltalk.ClassBuilder]
+referencedClasses: [smalltalk.nil]
 }),
 smalltalk.Class);
 
@@ -1711,7 +1727,7 @@ return self;},
 args: ["aCollection"],
 source: unescape('instanceVariableNames%3A%20aCollection%0A%09ClassBuilder%20new%0A%09%20%20%20%20class%3A%20self%20instanceVariableNames%3A%20aCollection'),
 messageSends: ["class:instanceVariableNames:", "new"],
-referencedClasses: [smalltalk.ClassBuilder]
+referencedClasses: [smalltalk.nil]
 }),
 smalltalk.Metaclass);
 
@@ -2293,7 +2309,7 @@ return self;},
 args: [],
 source: unescape('atRandom%0A%20%20%20%20%5E%28Random%20new%20next%20*%20self%29%20truncated%20+%201'),
 messageSends: [unescape("+"), "truncated", unescape("*"), "next", "new"],
-referencedClasses: [smalltalk.Random]
+referencedClasses: [smalltalk.nil]
 }),
 smalltalk.Number);
 
@@ -2309,7 +2325,7 @@ return self;},
 args: ["aNumber"],
 source: unescape('@%20aNumber%0A%09%5EPoint%20x%3A%20self%20y%3A%20aNumber'),
 messageSends: ["x:y:"],
-referencedClasses: [smalltalk.Point]
+referencedClasses: [smalltalk.nil]
 }),
 smalltalk.Number);
 
@@ -2325,7 +2341,7 @@ return self;},
 args: [],
 source: unescape('asPoint%0A%09%5EPoint%20x%3A%20self%20y%3A%20self'),
 messageSends: ["x:y:"],
-referencedClasses: [smalltalk.Point]
+referencedClasses: [smalltalk.nil]
 }),
 smalltalk.Number);
 
@@ -3885,7 +3901,7 @@ return self;},
 args: ["aString", "aString2", "aString3"],
 source: unescape('subclass%3A%20aString%20instanceVariableNames%3A%20aString2%20package%3A%20aString3%0A%09%5EClassBuilder%20new%0A%09%20%20%20%20superclass%3A%20self%20subclass%3A%20aString%20instanceVariableNames%3A%20aString2%20package%3A%20aString3'),
 messageSends: ["superclass:subclass:instanceVariableNames:package:", "new"],
-referencedClasses: [smalltalk.ClassBuilder]
+referencedClasses: [smalltalk.nil]
 }),
 smalltalk.UndefinedObject);
 
@@ -4332,7 +4348,7 @@ return self;},
 args: [],
 source: unescape('asSet%0A%09%5ESet%20withAll%3A%20self'),
 messageSends: ["withAll:"],
-referencedClasses: [smalltalk.Set]
+referencedClasses: [smalltalk.nil]
 }),
 smalltalk.Collection);
 
@@ -4381,7 +4397,7 @@ return self;},
 args: [],
 source: unescape('streamClass%0A%09%20%20%20%20%5EStream'),
 messageSends: [],
-referencedClasses: [smalltalk.Stream]
+referencedClasses: [smalltalk.nil]
 }),
 smalltalk.Collection.klass);
 
@@ -5574,7 +5590,7 @@ return self;},
 args: [],
 source: unescape('streamClass%0A%09%20%20%20%20%5EStringStream'),
 messageSends: [],
-referencedClasses: [smalltalk.StringStream]
+referencedClasses: [smalltalk.nil]
 }),
 smalltalk.String.klass);
 
@@ -6317,57 +6333,6 @@ smalltalk.MethodContext);
 
 
 
-smalltalk.addClass('Module', smalltalk.Object, [], 'Kernel');
-smalltalk.addMethod(
-'_name',
-smalltalk.method({
-selector: 'name',
-category: 'accessing',
-fn: function (){
-var self=this;
-return self.moduleName || nil;
-return self;},
-args: [],
-source: unescape('name%0A%09%3Creturn%20self.moduleName%20%7C%7C%20nil%3E'),
-messageSends: [],
-referencedClasses: []
-}),
-smalltalk.Module);
-
-smalltalk.addMethod(
-'_requires',
-smalltalk.method({
-selector: 'requires',
-category: 'accessing',
-fn: function (){
-var self=this;
-return self.requires || nil;
-return self;},
-args: [],
-source: unescape('requires%0A%09%3Creturn%20self.requires%20%7C%7C%20nil%3E'),
-messageSends: [],
-referencedClasses: []
-}),
-smalltalk.Module);
-
-smalltalk.addMethod(
-'_name_',
-smalltalk.method({
-selector: 'name:',
-category: 'accessing',
-fn: function (aString){
-var self=this;
-return self.moduleName = aString;
-return self;},
-args: ["aString"],
-source: unescape('name%3A%20aString%0A%09%3Creturn%20self.moduleName%20%3D%20aString%3E'),
-messageSends: [],
-referencedClasses: []
-}),
-smalltalk.Module);
-
-
-
 smalltalk.addClass('Association', smalltalk.Object, ['key', 'value'], 'Kernel');
 smalltalk.addMethod(
 '__eq',
@@ -7128,7 +7093,7 @@ return self;},
 args: [],
 source: unescape('initialize%0A%09super%20initialize.%0A%09chunkParser%20%3A%3D%20ChunkParser%20new.'),
 messageSends: ["initialize", "new"],
-referencedClasses: [smalltalk.ChunkParser]
+referencedClasses: [smalltalk.nil]
 }),
 smalltalk.ClassCategoryReader);
 
@@ -7181,7 +7146,7 @@ return self;},
 args: ["aString"],
 source: unescape('compileMethod%3A%20aString%0A%09%7C%20method%20%7C%0A%09method%20%3A%3D%20Compiler%20new%20load%3A%20aString%20forClass%3A%20class.%0A%09method%20category%3A%20category.%0A%09class%20addCompiledMethod%3A%20method'),
 messageSends: ["load:forClass:", "new", "category:", "addCompiledMethod:"],
-referencedClasses: [smalltalk.Compiler]
+referencedClasses: [smalltalk.nil]
 }),
 smalltalk.ClassCategoryReader);
 
@@ -7749,7 +7714,7 @@ return self;},
 args: [],
 source: unescape('initialize%0A%09super%20initialize.%0A%09chunkParser%20%3A%3D%20ChunkParser%20new.'),
 messageSends: ["initialize", "new"],
-referencedClasses: [smalltalk.ChunkParser]
+referencedClasses: [smalltalk.nil]
 }),
 smalltalk.ClassCommentReader);
 

+ 100 - 56
st/Kernel.st

@@ -1,43 +1,3 @@
-!ClassBuilder methodsFor: 'class creation'!
-
-superclass: aClass subclass: aString
-	^self superclass: aClass subclass: aString instanceVariableNames: '' package: nil
-!
-
-class: aClass instanceVariableNames: aString
-	aClass isMetaclass ifFalse: [self error: aClass name, ' is not a metaclass'].
-	aClass basicAt: 'iVarNames' put: (self instanceVariableNamesFor: aString).
-	self setupClass: aClass
-!
-
-superclass: aClass subclass: aString instanceVariableNames: aString2 package: aString3
-	| newClass |
-	newClass := self addSubclassOf: aClass
-				named: aString instanceVariableNames: (self instanceVariableNamesFor: aString2)
-				package: (aString3 ifNil: ['unclassified']).
-	self setupClass: newClass
-! !
-
-!ClassBuilder methodsFor: 'private'!
-
-instanceVariableNamesFor: aString
-	^(aString tokenize: ' ') reject: [:each | each isEmpty]
-!
-
-addSubclassOf: aClass named: aString instanceVariableNames: aCollection
-	<smalltalk.addClass(aString, aClass, aCollection);
-	    return smalltalk[aString]>
-!
-
-setupClass: aClass
-	<smalltalk.init(aClass);>
-!
-
-addSubclassOf: aClass named: aString instanceVariableNames: aCollection package: packageName
-	<smalltalk.addClass(aString, aClass, aCollection, packageName);
-	    return smalltalk[aString]>
-! !
-
 nil subclass: #Object
 	instanceVariableNames: ''
 	category: 'Kernel'!
@@ -338,10 +298,28 @@ parseError: anException parsing: aString
                   lines withIndexDo: [:l :i |
                      s nextPutAll: i asString, ': ', l, String lf]].
 	^ Error new messageText: ('Parse error on line ' , row , ' column ' , col , ' : ' , message , ' Below is code with line numbers and ===> marker inserted:' , String lf, code)
-!
+! !
+
+!Smalltalk methodsFor: 'packages'!
 
 packages
 	<return self.packages.all()>
+!
+
+packageAt: packageName
+       <return self.packages[packageName]>
+!
+
+packageAt: packageName ifAbsent: aBlock
+       ^(self packageAt: packageName) ifNil: aBlock
+!
+
+createPackage: packageName
+       <return smalltalk.addPackage(packageName)>
+!
+
+deletePackage: packageName
+       <delete smalltalk.packages[packageName]>
 ! !
 
 Smalltalk class instanceVariableNames: 'current'!
@@ -547,11 +525,6 @@ package: aPackage
 
 !Class methodsFor: 'class creation'!
 
-subclass: aString instanceVariableNames: aString2 package: aString3
-	^ClassBuilder new
-	    superclass: self subclass: aString instanceVariableNames: aString2 package: aString3
-!
-
 subclass: aString instanceVariableNames: anotherString
 	"Kept for compatibility."
 	^self subclass: aString instanceVariableNames: anotherString package: nil
@@ -565,6 +538,16 @@ subclass: aString instanceVariableNames: aString2 category: aString3
 subclass: aString instanceVariableNames: aString2 classVariableNames: classVars poolDictionaries: pools category: aString3
 	"Just ignore class variables and pools. Added for compatibility."
 	^self subclass: aString instanceVariableNames: aString2 package: aString3
+!
+
+subclass: aString instanceVariableNames: aString2 module: aString3
+	^ClassBuilder new
+	    superclass: self subclass: aString instanceVariableNames: aString2 module: aString3
+!
+
+subclass: aString instanceVariableNames: aString2 package: aString3
+	^ClassBuilder new
+	    superclass: self subclass: aString instanceVariableNames: aString2 package: aString3
 ! !
 
 !Class methodsFor: 'printing'!
@@ -704,6 +687,11 @@ negated
 
 !Number methodsFor: 'comparing'!
 
+= aNumber
+	aNumber class = self class ifFalse: [^false]. 
+	<return Number(self) == aNumber>
+!
+
 > aNumber
 	"Inlined in the Compiler"
 	<return self >> aNumber>
@@ -724,11 +712,6 @@ negated
 	<return self <= aNumber>
 !
 
-= aNumber
-	aNumber class = self class ifFalse: [^false]. 
-	<return Number(self) == aNumber>
-!
-
 == aNumber
 	aNumber class = self class ifFalse: [^false]. 
 	<return Number(self) === Number(aNumber)>
@@ -1233,6 +1216,11 @@ subclass: aString instanceVariableNames: aString2 category: aString3
 	^self subclass: aString instanceVariableNames: aString2 package: aString3
 !
 
+subclass: aString instanceVariableNames: aString2 module: aString3
+	^ClassBuilder new
+	    superclass: self subclass: aString instanceVariableNames: aString2 module: aString3
+!
+
 subclass: aString instanceVariableNames: aString2 package: aString3
 	^ClassBuilder new
 	    superclass: self subclass: aString instanceVariableNames: aString2 package: aString3
@@ -1641,6 +1629,11 @@ remove: anObject
 
 !String methodsFor: 'comparing'!
 
+= aString
+	aString class = self class ifFalse: [^false].
+	<return String(self) == aString>
+!
+
 > aString
 	<return String(self) >> aString>
 !
@@ -1657,11 +1650,6 @@ remove: anObject
 	<return String(self) <= aString>
 !
 
-= aString
-	aString class = self class ifFalse: [^false].
-	<return String(self) == aString>
-!
-
 == aString
 	aString class = self class ifFalse: [^false].
 	<return String(self) === String(aString)>
@@ -2373,6 +2361,58 @@ Object subclass: #ClassBuilder
 	instanceVariableNames: ''
 	category: 'Kernel'!
 
+!ClassBuilder methodsFor: 'class creation'!
+
+superclass: aClass subclass: aString
+	^self superclass: aClass subclass: aString instanceVariableNames: '' package: nil
+!
+
+class: aClass instanceVariableNames: aString
+	aClass isMetaclass ifFalse: [self error: aClass name, ' is not a metaclass'].
+	aClass basicAt: 'iVarNames' put: (self instanceVariableNamesFor: aString).
+	self setupClass: aClass
+!
+
+superclass: aClass subclass: aString instanceVariableNames: aString2 module: aString3
+	| newClass |
+	newClass := self addSubclassOf: aClass
+				named: aString instanceVariableNames: (self instanceVariableNamesFor: aString2)
+				module: (aString3 ifNil: ['unclassified']).
+	self setupClass: newClass
+!
+
+superclass: aClass subclass: aString instanceVariableNames: aString2 package: aString3
+	| newClass |
+	newClass := self addSubclassOf: aClass
+				named: aString instanceVariableNames: (self instanceVariableNamesFor: aString2)
+				package: (aString3 ifNil: ['unclassified']).
+	self setupClass: newClass
+! !
+
+!ClassBuilder methodsFor: 'private'!
+
+instanceVariableNamesFor: aString
+	^(aString tokenize: ' ') reject: [:each | each isEmpty]
+!
+
+addSubclassOf: aClass named: aString instanceVariableNames: aCollection
+	<smalltalk.addClass(aString, aClass, aCollection);
+	    return smalltalk[aString]>
+!
+
+setupClass: aClass
+	<smalltalk.init(aClass);>
+!
+
+addSubclassOf: aClass named: aString instanceVariableNames: aCollection module: moduleName
+	<smalltalk.addClass(aString, aClass, aCollection, moduleName);
+	    return smalltalk[aString]>
+!
+
+addSubclassOf: aClass named: aString instanceVariableNames: aCollection package: packageName
+	<smalltalk.addClass(aString, aClass, aCollection, packageName);
+	    return smalltalk[aString]>
+! !
 
 Object subclass: #ClassCategoryReader
 	instanceVariableNames: 'class category chunkParser'
@@ -2791,6 +2831,10 @@ setCurrent: anHandler
 
 !ErrorHandler class methodsFor: 'initialization'!
 
+initialize
+	self register
+!
+
 register
 	ErrorHandler setCurrent: self new
 ! !