| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374 | Smalltalk current createPackage: 'Kernel-Classes' properties: #{}!Object subclass: #Behavior	instanceVariableNames: ''	category: 'Kernel-Classes'!!Behavior methodsFor: 'accessing'!name	<return self.className || nil>!superclass	<return self.superclass || nil>!subclasses	<return smalltalk.subclasses(self)>!allSubclasses	| result |	result := self subclasses.	self subclasses do: [:each |	    result addAll: each allSubclasses].	^result!withAllSubclasses	^(Array with: self) addAll: self allSubclasses; yourself!prototype	<return self.fn.prototype>!methodDictionary	<var dict = smalltalk.HashedCollection._new();	var methods = self.fn.prototype.methods;	for(var i in methods) {		if(methods[i].selector) {			dict._at_put_(methods[i].selector, methods[i]);		}	};	return dict>!methodsFor: aString	^ClassCategoryReader new	    class: self category: aString;	    yourself!addCompiledMethod: aMethod	<smalltalk.addMethod(aMethod.selector._asSelector(), aMethod, self)>!instanceVariableNames	<return self.iVarNames>!comment    ^(self basicAt: 'comment') ifNil: ['']!comment: aString    self basicAt: 'comment' put: aString!commentStamp    ^ClassCommentReader new	class: self;	yourself!removeCompiledMethod: aMethod	<delete self.fn.prototype[aMethod.selector._asSelector()];	delete self.fn.prototype.methods[aMethod.selector];	smalltalk.init(self);>!protocols    | protocols |    protocols := Array new.    self methodDictionary do: [:each |	    (protocols includes: each category) ifFalse: [		protocols add: each category]].    ^protocols sort!protocolsDo: aBlock	"Execute aBlock for each method category with	its collection of methods in the sort order of category name."	| methodsByCategory |	methodsByCategory := HashedCollection new.	self methodDictionary values do: [:m |		(methodsByCategory at: m category ifAbsentPut: [Array new]) 			add: m]. 	self protocols do: [:category |		aBlock value: category value: (methodsByCategory at: category)]!allInstanceVariableNames	| result |	result := self instanceVariableNames copy.	self superclass ifNotNil: [	    result addAll: self superclass allInstanceVariableNames].	^result!methodAt: aString	<return smalltalk.methods(self)[aString]>!methodsFor: aString stamp: aStamp	"Added for compatibility, right now ignores stamp."	^self methodsFor: aString!commentStamp: aStamp prior: prior        ^self commentStamp! !!Behavior methodsFor: 'compiling'!compile: aString	self compile: aString category: ''!compile: aString category: anotherString	| method |	method := Compiler new load: aString forClass: self.	method category: anotherString.	self addCompiledMethod: method! !!Behavior methodsFor: 'instance creation'!new	^self basicNew initialize!basicNew	<return new self.fn()>!inheritsFrom: aClass	^aClass allSubclasses includes: self! !Behavior subclass: #Class	instanceVariableNames: ''	category: 'Kernel-Classes'!!Class methodsFor: 'accessing'!category	^self package ifNil: ['Unclassified'] ifNotNil: [self package name]!rename: aString	<		smalltalk[aString] = self;		delete smalltalk[self.className];		self.className = aString;	>!package	<return self.pkg>!package: aPackage	<self.pkg = aPackage>! !!Class methodsFor: 'class creation'!subclass: aString instanceVariableNames: anotherString	"Kept for compatibility."	^self subclass: aString instanceVariableNames: anotherString package: nil!subclass: aString instanceVariableNames: aString2 category: aString3	"Kept for compatibility."	self deprecatedAPI.	^self subclass: aString instanceVariableNames: aString2 package: 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 package: aString3	^ClassBuilder new	    superclass: self subclass: aString asString instanceVariableNames: aString2 package: aString3! !!Class methodsFor: 'printing'!printString	^self name! !!Class methodsFor: 'testing'!isClass	^true! !Behavior subclass: #Metaclass	instanceVariableNames: ''	category: 'Kernel-Classes'!!Metaclass methodsFor: 'accessing'!instanceClass	<return self.instanceClass>!instanceVariableNames: aCollection	ClassBuilder new	    class: self instanceVariableNames: aCollection! !!Metaclass methodsFor: 'printing'!printString	^self instanceClass name, ' class'! !!Metaclass methodsFor: 'testing'!isMetaclass	^true! !Object subclass: #ClassBuilder	instanceVariableNames: ''	category: 'Kernel-Classes'!!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.	^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]>!copyClass: aClass named: aString	| newClass |	newClass := self 		addSubclassOf: aClass superclass		named: aString 		instanceVariableNames: aClass instanceVariableNames 		package: aClass package name.	self setupClass: newClass.	aClass methodDictionary values do: [:each |		newClass addCompiledMethod: (Compiler new load: each source forClass: newClass).		(newClass methodDictionary at: each selector) category: each category].	aClass class methodDictionary values do: [:each |		newClass class addCompiledMethod: (Compiler new load: each source forClass: newClass class).		(newClass class methodDictionary at: each selector) category: each category].	self setupClass: newClass.	^newClass! !Object subclass: #ClassCategoryReader	instanceVariableNames: 'class category chunkParser'	category: 'Kernel-Classes'!!ClassCategoryReader methodsFor: 'accessing'!class: aClass category: aString	class := aClass.	category := aString! !!ClassCategoryReader methodsFor: 'fileIn'!scanFrom: aChunkParser	| chunk |	[chunk := aChunkParser nextChunk.	chunk isEmpty] whileFalse: [	    self compileMethod: chunk]! !!ClassCategoryReader methodsFor: 'initialization'!initialize	super initialize.	chunkParser := ChunkParser new.! !!ClassCategoryReader methodsFor: 'private'!compileMethod: aString	| method |	method := Compiler new load: aString forClass: class.	method category: category.	class addCompiledMethod: method! !Object subclass: #ClassCommentReader	instanceVariableNames: 'class chunkParser'	category: 'Kernel-Classes'!!ClassCommentReader methodsFor: 'accessing'!class: aClass	class := aClass! !!ClassCommentReader methodsFor: 'fileIn'!scanFrom: aChunkParser	| chunk |	chunk := aChunkParser nextChunk.	chunk isEmpty ifFalse: [	    self setComment: chunk].! !!ClassCommentReader methodsFor: 'initialization'!initialize	super initialize.	chunkParser := ChunkParser new.! !!ClassCommentReader methodsFor: 'private'!setComment: aString    class comment: aString! !
 |