Browse Source

Extract BehaviorBody.

Herbert Vojčík 7 years ago
parent
commit
f8835a3d70
5 changed files with 812 additions and 704 deletions
  1. 635 563
      src/Kernel-Classes.js
  2. 140 111
      src/Kernel-Classes.st
  3. 24 24
      src/Platform-ImportExport.js
  4. 6 4
      src/Platform-ImportExport.st
  5. 7 2
      support/boot.js

+ 635 - 563
src/Kernel-Classes.js

@@ -6,9 +6,9 @@ $core.addPackage('Kernel-Classes');
 $core.packages["Kernel-Classes"].innerEval = function (expr) { return eval(expr); };
 $core.packages["Kernel-Classes"].transport = {"type":"amd","amdNamespace":"amber_core"};
 
-$core.addClass('Behavior', $globals.Object, [], 'Kernel-Classes');
+$core.addClass('BehaviorBody', $globals.Object, [], 'Kernel-Classes');
 //>>excludeStart("ide", pragmas.excludeIdeData);
-$globals.Behavior.comment="I am the superclass of all class objects.\x0a\x0aI define the protocol for creating instances of a class with `#basicNew` and `#new` (see `boot.js` for class constructors details).\x0a\x0aMy instances know about the subclass/superclass relationships between classes, contain the description that instances are created from,\x0aand hold the method dictionary that's associated with each class.\x0a\x0aI also provides methods for compiling methods, examining the method dictionary, and iterating over the class hierarchy.";
+$globals.BehaviorBody.comment="I am the superclass of all behaviors.\x0a\x0aMy instances hold the method dictionary.\x0a\x0aI also provides methods for compiling methods and examining the method dictionary.";
 //>>excludeEnd("ide");
 $core.addMethod(
 $core.method({
@@ -21,7 +21,7 @@ return $core.withContext(function($ctx1) {
 //>>excludeEnd("ctx");
 return self._methodAt_(aString);
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,">>",{aString:aString},$globals.Behavior)});
+}, function($ctx1) {$ctx1.fill(self,">>",{aString:aString},$globals.BehaviorBody)});
 //>>excludeEnd("ctx");
 },
 //>>excludeStart("ide", pragmas.excludeIdeData);
@@ -31,7 +31,7 @@ referencedClasses: [],
 //>>excludeEnd("ide");
 messageSends: ["methodAt:"]
 }),
-$globals.Behavior);
+$globals.BehaviorBody);
 
 $core.addMethod(
 $core.method({
@@ -93,7 +93,7 @@ announcement=$recv($10)._yourself();
 $recv($recv($globals.SystemAnnouncer)._current())._announce_(announcement);
 return self;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"addCompiledMethod:",{aMethod:aMethod,oldMethod:oldMethod,announcement:announcement},$globals.Behavior)});
+}, function($ctx1) {$ctx1.fill(self,"addCompiledMethod:",{aMethod:aMethod,oldMethod:oldMethod,announcement:announcement},$globals.BehaviorBody)});
 //>>excludeEnd("ctx");
 },
 //>>excludeStart("ide", pragmas.excludeIdeData);
@@ -103,184 +103,7 @@ referencedClasses: ["MethodAdded", "MethodModified", "SystemAnnouncer"],
 //>>excludeEnd("ide");
 messageSends: ["at:ifAbsent:", "methodDictionary", "selector", "ifFalse:", "includes:", "protocols", "protocol", "addElement:", "organization", "basicAddCompiledMethod:", "ifNotNil:", "removeProtocolIfEmpty:", "ifNil:ifNotNil:", "method:", "new", "yourself", "oldMethod:", "announce:", "current"]
 }),
-$globals.Behavior);
-
-$core.addMethod(
-$core.method({
-selector: "allInstanceVariableNames",
-protocol: 'accessing',
-fn: function (){
-var self=this;
-var result;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-var $1,$receiver;
-result=$recv(self._instanceVariableNames())._copy();
-$1=self._superclass();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["superclass"]=1;
-//>>excludeEnd("ctx");
-if(($receiver = $1) == null || $receiver.isNil){
-$1;
-} else {
-$recv(result)._addAll_($recv(self._superclass())._allInstanceVariableNames());
-}
-return result;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"allInstanceVariableNames",{result:result},$globals.Behavior)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: [],
-source: "allInstanceVariableNames\x0a\x09| result |\x0a\x09result := self instanceVariableNames copy.\x0a\x09self superclass ifNotNil: [\x0a\x09\x09result addAll: self superclass allInstanceVariableNames ].\x0a\x09^ result",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: ["copy", "instanceVariableNames", "ifNotNil:", "superclass", "addAll:", "allInstanceVariableNames"]
-}),
-$globals.Behavior);
-
-$core.addMethod(
-$core.method({
-selector: "allSelectors",
-protocol: 'accessing',
-fn: function (){
-var self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-var $1,$2;
-$1=self._allSuperclasses();
-$2=self._selectors();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["selectors"]=1;
-//>>excludeEnd("ctx");
-return $recv($1)._inject_into_($2,(function(acc,each){
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx2) {
-//>>excludeEnd("ctx");
-$recv(acc)._addAll_($recv(each)._selectors());
-return $recv(acc)._yourself();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx2) {$ctx2.fillBlock({acc:acc,each:each},$ctx1,1)});
-//>>excludeEnd("ctx");
-}));
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"allSelectors",{},$globals.Behavior)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: [],
-source: "allSelectors\x0a\x09^ self allSuperclasses\x0a\x09\x09inject: self selectors\x0a\x09\x09into: [ :acc :each | acc addAll: each selectors; yourself ]",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: ["inject:into:", "allSuperclasses", "selectors", "addAll:", "yourself"]
-}),
-$globals.Behavior);
-
-$core.addMethod(
-$core.method({
-selector: "allSubclasses",
-protocol: 'accessing',
-fn: function (){
-var self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-return $recv($globals.Array)._streamContents_((function(str){
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx2) {
-//>>excludeEnd("ctx");
-return self._allSubclassesDo_((function(each){
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx3) {
-//>>excludeEnd("ctx");
-return $recv(str)._nextPut_(each);
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx3) {$ctx3.fillBlock({each:each},$ctx2,2)});
-//>>excludeEnd("ctx");
-}));
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx2) {$ctx2.fillBlock({str:str},$ctx1,1)});
-//>>excludeEnd("ctx");
-}));
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"allSubclasses",{},$globals.Behavior)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: [],
-source: "allSubclasses\x0a\x09\x22Answer an collection of the receiver's and the receiver's descendent's subclasses. \x22\x0a\x0a\x09^ Array streamContents: [ :str | self allSubclassesDo: [ :each | str nextPut: each ] ]",
-referencedClasses: ["Array"],
-//>>excludeEnd("ide");
-messageSends: ["streamContents:", "allSubclassesDo:", "nextPut:"]
-}),
-$globals.Behavior);
-
-$core.addMethod(
-$core.method({
-selector: "allSubclassesDo:",
-protocol: 'enumerating',
-fn: function (aBlock){
-var self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-$core.traverseClassTree(self, function(subclass) {
-	if (subclass !== self) aBlock._value_(subclass);
-});
-return self;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"allSubclassesDo:",{aBlock:aBlock},$globals.Behavior)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: ["aBlock"],
-source: "allSubclassesDo: aBlock\x0a\x09\x22Evaluate the argument, aBlock, for each of the receiver's subclasses.\x22\x0a\x0a<inlineJS: '$core.traverseClassTree(self, function(subclass) {\x0a\x09if (subclass !== self) aBlock._value_(subclass);\x0a})'>",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: []
-}),
-$globals.Behavior);
-
-$core.addMethod(
-$core.method({
-selector: "allSuperclasses",
-protocol: 'accessing',
-fn: function (){
-var self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-var $1,$3,$2,$receiver;
-$1=self._superclass();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["superclass"]=1;
-//>>excludeEnd("ctx");
-if(($receiver = $1) == null || $receiver.isNil){
-return [];
-} else {
-$1;
-}
-$3=self._superclass();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["superclass"]=2;
-//>>excludeEnd("ctx");
-$2=$recv($globals.OrderedCollection)._with_($3);
-$recv($2)._addAll_($recv(self._superclass())._allSuperclasses());
-return $recv($2)._yourself();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"allSuperclasses",{},$globals.Behavior)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: [],
-source: "allSuperclasses\x0a\x09\x0a\x09self superclass ifNil: [ ^ #() ].\x0a\x09\x0a\x09^ (OrderedCollection with: self superclass)\x0a\x09\x09addAll: self superclass allSuperclasses;\x0a\x09\x09yourself",
-referencedClasses: ["OrderedCollection"],
-//>>excludeEnd("ide");
-messageSends: ["ifNil:", "superclass", "addAll:", "with:", "allSuperclasses", "yourself"]
-}),
-$globals.Behavior);
+$globals.BehaviorBody);
 
 $core.addMethod(
 $core.method({
@@ -294,7 +117,7 @@ return $core.withContext(function($ctx1) {
 $core.addMethod(aMethod, self);
 return self;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"basicAddCompiledMethod:",{aMethod:aMethod},$globals.Behavior)});
+}, function($ctx1) {$ctx1.fill(self,"basicAddCompiledMethod:",{aMethod:aMethod},$globals.BehaviorBody)});
 //>>excludeEnd("ctx");
 },
 //>>excludeStart("ide", pragmas.excludeIdeData);
@@ -304,31 +127,7 @@ referencedClasses: [],
 //>>excludeEnd("ide");
 messageSends: []
 }),
-$globals.Behavior);
-
-$core.addMethod(
-$core.method({
-selector: "basicNew",
-protocol: 'instance creation',
-fn: function (){
-var self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-return new self.fn();
-return self;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"basicNew",{},$globals.Behavior)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: [],
-source: "basicNew\x0a\x09<inlineJS: 'return new self.fn()'>",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: []
-}),
-$globals.Behavior);
+$globals.BehaviorBody);
 
 $core.addMethod(
 $core.method({
@@ -342,7 +141,7 @@ return $core.withContext(function($ctx1) {
 $core.removeMethod(aMethod,self);
 return self;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"basicRemoveCompiledMethod:",{aMethod:aMethod},$globals.Behavior)});
+}, function($ctx1) {$ctx1.fill(self,"basicRemoveCompiledMethod:",{aMethod:aMethod},$globals.BehaviorBody)});
 //>>excludeEnd("ctx");
 },
 //>>excludeStart("ide", pragmas.excludeIdeData);
@@ -352,52 +151,7 @@ referencedClasses: [],
 //>>excludeEnd("ide");
 messageSends: []
 }),
-$globals.Behavior);
-
-$core.addMethod(
-$core.method({
-selector: "canUnderstand:",
-protocol: 'testing',
-fn: function (aSelector){
-var self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-var $2,$1;
-return $recv(self._includesSelector_($recv(aSelector)._asString()))._or_((function(){
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx2) {
-//>>excludeEnd("ctx");
-$2=self._superclass();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx2.sendIdx["superclass"]=1;
-//>>excludeEnd("ctx");
-$1=$recv($2)._notNil();
-return $recv($1)._and_((function(){
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx3) {
-//>>excludeEnd("ctx");
-return $recv(self._superclass())._canUnderstand_(aSelector);
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx3) {$ctx3.fillBlock({},$ctx2,2)});
-//>>excludeEnd("ctx");
-}));
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)});
-//>>excludeEnd("ctx");
-}));
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"canUnderstand:",{aSelector:aSelector},$globals.Behavior)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: ["aSelector"],
-source: "canUnderstand: aSelector\x0a\x09^ (self includesSelector: aSelector asString) or: [\x0a\x09\x09self superclass notNil and: [ self superclass canUnderstand: aSelector ]]",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: ["or:", "includesSelector:", "asString", "and:", "notNil", "superclass", "canUnderstand:"]
-}),
-$globals.Behavior);
+$globals.BehaviorBody);
 
 $core.addMethod(
 $core.method({
@@ -416,7 +170,7 @@ return "";
 return $1;
 }
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"comment",{},$globals.Behavior)});
+}, function($ctx1) {$ctx1.fill(self,"comment",{},$globals.BehaviorBody)});
 //>>excludeEnd("ctx");
 },
 //>>excludeStart("ide", pragmas.excludeIdeData);
@@ -426,7 +180,7 @@ referencedClasses: [],
 //>>excludeEnd("ide");
 messageSends: ["ifNil:", "basicAt:"]
 }),
-$globals.Behavior);
+$globals.BehaviorBody);
 
 $core.addMethod(
 $core.method({
@@ -446,7 +200,7 @@ $2=$recv($3)._yourself();
 $recv($1)._announce_($2);
 return self;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"comment:",{aString:aString},$globals.Behavior)});
+}, function($ctx1) {$ctx1.fill(self,"comment:",{aString:aString},$globals.BehaviorBody)});
 //>>excludeEnd("ctx");
 },
 //>>excludeStart("ide", pragmas.excludeIdeData);
@@ -456,7 +210,7 @@ referencedClasses: ["SystemAnnouncer", "ClassCommentChanged"],
 //>>excludeEnd("ide");
 messageSends: ["basicAt:put:", "announce:", "current", "theClass:", "new", "yourself"]
 }),
-$globals.Behavior);
+$globals.BehaviorBody);
 
 $core.addMethod(
 $core.method({
@@ -469,7 +223,7 @@ return $core.withContext(function($ctx1) {
 //>>excludeEnd("ctx");
 return $recv($recv($globals.Compiler)._new())._install_forClass_protocol_(aString,self,anotherString);
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"compile:protocol:",{aString:aString,anotherString:anotherString},$globals.Behavior)});
+}, function($ctx1) {$ctx1.fill(self,"compile:protocol:",{aString:aString,anotherString:anotherString},$globals.BehaviorBody)});
 //>>excludeEnd("ctx");
 },
 //>>excludeStart("ide", pragmas.excludeIdeData);
@@ -479,7 +233,7 @@ referencedClasses: ["Compiler"],
 //>>excludeEnd("ide");
 messageSends: ["install:forClass:protocol:", "new"]
 }),
-$globals.Behavior);
+$globals.BehaviorBody);
 
 $core.addMethod(
 $core.method({
@@ -497,42 +251,11 @@ referencedClasses: [],
 //>>excludeEnd("ide");
 messageSends: []
 }),
-$globals.Behavior);
+$globals.BehaviorBody);
 
 $core.addMethod(
 $core.method({
-selector: "includesBehavior:",
-protocol: 'testing',
-fn: function (aClass){
-var self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-return $recv(self.__eq_eq(aClass))._or_((function(){
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx2) {
-//>>excludeEnd("ctx");
-return self._inheritsFrom_(aClass);
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)});
-//>>excludeEnd("ctx");
-}));
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"includesBehavior:",{aClass:aClass},$globals.Behavior)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: ["aClass"],
-source: "includesBehavior: aClass\x0a\x09^ self == aClass or: [\x0a\x09\x09\x09self inheritsFrom: aClass ]",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: ["or:", "==", "inheritsFrom:"]
-}),
-$globals.Behavior);
-
-$core.addMethod(
-$core.method({
-selector: "includesSelector:",
+selector: "includesSelector:",
 protocol: 'testing',
 fn: function (aString){
 var self=this;
@@ -541,7 +264,7 @@ return $core.withContext(function($ctx1) {
 //>>excludeEnd("ctx");
 return $recv(self._methodDictionary())._includesKey_(aString);
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"includesSelector:",{aString:aString},$globals.Behavior)});
+}, function($ctx1) {$ctx1.fill(self,"includesSelector:",{aString:aString},$globals.BehaviorBody)});
 //>>excludeEnd("ctx");
 },
 //>>excludeStart("ide", pragmas.excludeIdeData);
@@ -551,195 +274,7 @@ referencedClasses: [],
 //>>excludeEnd("ide");
 messageSends: ["includesKey:", "methodDictionary"]
 }),
-$globals.Behavior);
-
-$core.addMethod(
-$core.method({
-selector: "inheritsFrom:",
-protocol: 'testing',
-fn: function (aClass){
-var self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-var $1,$3,$2,$receiver;
-$1=self._superclass();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["superclass"]=1;
-//>>excludeEnd("ctx");
-if(($receiver = $1) == null || $receiver.isNil){
-return false;
-} else {
-$1;
-}
-$3=self._superclass();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["superclass"]=2;
-//>>excludeEnd("ctx");
-$2=$recv(aClass).__eq_eq($3);
-return $recv($2)._or_((function(){
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx2) {
-//>>excludeEnd("ctx");
-return $recv(self._superclass())._inheritsFrom_(aClass);
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx2) {$ctx2.fillBlock({},$ctx1,2)});
-//>>excludeEnd("ctx");
-}));
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"inheritsFrom:",{aClass:aClass},$globals.Behavior)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: ["aClass"],
-source: "inheritsFrom: aClass\x0a\x09self superclass ifNil: [ ^ false ].\x0a\x0a\x09^ aClass == self superclass or: [ \x0a\x09\x09self superclass inheritsFrom: aClass ]",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: ["ifNil:", "superclass", "or:", "==", "inheritsFrom:"]
-}),
-$globals.Behavior);
-
-$core.addMethod(
-$core.method({
-selector: "instanceVariableNames",
-protocol: 'accessing',
-fn: function (){
-var self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-return self.iVarNames;
-return self;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"instanceVariableNames",{},$globals.Behavior)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: [],
-source: "instanceVariableNames\x0a\x09<inlineJS: 'return self.iVarNames'>",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: []
-}),
-$globals.Behavior);
-
-$core.addMethod(
-$core.method({
-selector: "isBehavior",
-protocol: 'testing',
-fn: function (){
-var self=this;
-return true;
-
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: [],
-source: "isBehavior\x0a\x09^ true",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: []
-}),
-$globals.Behavior);
-
-$core.addMethod(
-$core.method({
-selector: "javascriptConstructor",
-protocol: 'accessing',
-fn: function (){
-var self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-return self.fn;
-return self;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"javascriptConstructor",{},$globals.Behavior)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: [],
-source: "javascriptConstructor\x0a\x09\x22Answer the JS constructor used to instantiate. See boot.js\x22\x0a\x09\x0a\x09<inlineJS: 'return self.fn'>",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: []
-}),
-$globals.Behavior);
-
-$core.addMethod(
-$core.method({
-selector: "javascriptConstructor:",
-protocol: 'accessing',
-fn: function (aJavaScriptFunction){
-var self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-$core.setClassConstructor(self, aJavaScriptFunction);;
-return self;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"javascriptConstructor:",{aJavaScriptFunction:aJavaScriptFunction},$globals.Behavior)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: ["aJavaScriptFunction"],
-source: "javascriptConstructor: aJavaScriptFunction\x0a\x09\x22Set the JS constructor used to instantiate.\x0a\x09See the JS counter-part in boot.js `$core.setClassConstructor'\x22\x0a\x09\x0a\x09<inlineJS: '$core.setClassConstructor(self, aJavaScriptFunction);'>",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: []
-}),
-$globals.Behavior);
-
-$core.addMethod(
-$core.method({
-selector: "lookupSelector:",
-protocol: 'accessing',
-fn: function (selector){
-var self=this;
-var lookupClass;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-var $1;
-var $early={};
-try {
-lookupClass=self;
-$recv((function(){
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx2) {
-//>>excludeEnd("ctx");
-return $recv(lookupClass).__eq(nil);
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)});
-//>>excludeEnd("ctx");
-}))._whileFalse_((function(){
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx2) {
-//>>excludeEnd("ctx");
-$1=$recv(lookupClass)._includesSelector_(selector);
-if($core.assert($1)){
-throw $early=[$recv(lookupClass)._methodAt_(selector)];
-}
-lookupClass=$recv(lookupClass)._superclass();
-return lookupClass;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx2) {$ctx2.fillBlock({},$ctx1,2)});
-//>>excludeEnd("ctx");
-}));
-return nil;
-}
-catch(e) {if(e===$early)return e[0]; throw e}
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"lookupSelector:",{selector:selector,lookupClass:lookupClass},$globals.Behavior)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: ["selector"],
-source: "lookupSelector: selector\x0a\x09\x22Look up the given selector in my methodDictionary.\x0a\x09Return the corresponding method if found.\x0a\x09Otherwise chase the superclass chain and try again.\x0a\x09Return nil if no method is found.\x22\x0a\x09\x0a\x09| lookupClass |\x0a\x09\x0a\x09lookupClass := self.\x0a\x09[ lookupClass = nil ] whileFalse: [\x0a\x09\x09(lookupClass includesSelector: selector)\x0a\x09\x09\x09\x09ifTrue: [ ^ lookupClass methodAt: selector ].\x0a\x09\x09\x09lookupClass := lookupClass superclass ].\x0a\x09^ nil",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: ["whileFalse:", "=", "ifTrue:", "includesSelector:", "methodAt:", "superclass"]
-}),
-$globals.Behavior);
+$globals.BehaviorBody);
 
 $core.addMethod(
 $core.method({
@@ -752,7 +287,7 @@ return $core.withContext(function($ctx1) {
 //>>excludeEnd("ctx");
 return $recv(self._methodDictionary())._at_(aString);
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"methodAt:",{aString:aString},$globals.Behavior)});
+}, function($ctx1) {$ctx1.fill(self,"methodAt:",{aString:aString},$globals.BehaviorBody)});
 //>>excludeEnd("ctx");
 },
 //>>excludeStart("ide", pragmas.excludeIdeData);
@@ -762,7 +297,7 @@ referencedClasses: [],
 //>>excludeEnd("ide");
 messageSends: ["at:", "methodDictionary"]
 }),
-$globals.Behavior);
+$globals.BehaviorBody);
 
 $core.addMethod(
 $core.method({
@@ -783,7 +318,7 @@ var dict = $globals.HashedCollection._new();
 	return dict;
 return self;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"methodDictionary",{},$globals.Behavior)});
+}, function($ctx1) {$ctx1.fill(self,"methodDictionary",{},$globals.BehaviorBody)});
 //>>excludeEnd("ctx");
 },
 //>>excludeStart("ide", pragmas.excludeIdeData);
@@ -793,7 +328,7 @@ referencedClasses: [],
 //>>excludeEnd("ide");
 messageSends: []
 }),
-$globals.Behavior);
+$globals.BehaviorBody);
 
 $core.addMethod(
 $core.method({
@@ -871,7 +406,7 @@ return $recv(stream)._nextPutAll_("statements");
 //>>excludeEnd("ctx");
 }));
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"methodTemplate",{},$globals.Behavior)});
+}, function($ctx1) {$ctx1.fill(self,"methodTemplate",{},$globals.BehaviorBody)});
 //>>excludeEnd("ctx");
 },
 //>>excludeStart("ide", pragmas.excludeIdeData);
@@ -881,7 +416,7 @@ referencedClasses: ["String"],
 //>>excludeEnd("ide");
 messageSends: ["streamContents:", "nextPutAll:", ",", "lf", "tab"]
 }),
-$globals.Behavior);
+$globals.BehaviorBody);
 
 $core.addMethod(
 $core.method({
@@ -894,7 +429,7 @@ return $core.withContext(function($ctx1) {
 //>>excludeEnd("ctx");
 return $recv(self._methodDictionary())._values();
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"methods",{},$globals.Behavior)});
+}, function($ctx1) {$ctx1.fill(self,"methods",{},$globals.BehaviorBody)});
 //>>excludeEnd("ctx");
 },
 //>>excludeStart("ide", pragmas.excludeIdeData);
@@ -904,7 +439,7 @@ referencedClasses: [],
 //>>excludeEnd("ide");
 messageSends: ["values", "methodDictionary"]
 }),
-$globals.Behavior);
+$globals.BehaviorBody);
 
 $core.addMethod(
 $core.method({
@@ -925,7 +460,7 @@ return $recv($recv(each)._protocol()).__eq(aString);
 //>>excludeEnd("ctx");
 }));
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"methodsInProtocol:",{aString:aString},$globals.Behavior)});
+}, function($ctx1) {$ctx1.fill(self,"methodsInProtocol:",{aString:aString},$globals.BehaviorBody)});
 //>>excludeEnd("ctx");
 },
 //>>excludeStart("ide", pragmas.excludeIdeData);
@@ -935,7 +470,7 @@ referencedClasses: [],
 //>>excludeEnd("ide");
 messageSends: ["select:", "methods", "=", "protocol"]
 }),
-$globals.Behavior);
+$globals.BehaviorBody);
 
 $core.addMethod(
 $core.method({
@@ -949,7 +484,7 @@ return $core.withContext(function($ctx1) {
 return self.className || nil;
 return self;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"name",{},$globals.Behavior)});
+}, function($ctx1) {$ctx1.fill(self,"name",{},$globals.BehaviorBody)});
 //>>excludeEnd("ctx");
 },
 //>>excludeStart("ide", pragmas.excludeIdeData);
@@ -959,30 +494,7 @@ referencedClasses: [],
 //>>excludeEnd("ide");
 messageSends: []
 }),
-$globals.Behavior);
-
-$core.addMethod(
-$core.method({
-selector: "new",
-protocol: 'instance creation',
-fn: function (){
-var self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-return $recv(self._basicNew())._initialize();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"new",{},$globals.Behavior)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: [],
-source: "new\x0a\x09^ self basicNew initialize",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: ["initialize", "basicNew"]
-}),
-$globals.Behavior);
+$globals.BehaviorBody);
 
 $core.addMethod(
 $core.method({
@@ -995,7 +507,7 @@ return $core.withContext(function($ctx1) {
 //>>excludeEnd("ctx");
 return self._basicAt_("organization");
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"organization",{},$globals.Behavior)});
+}, function($ctx1) {$ctx1.fill(self,"organization",{},$globals.BehaviorBody)});
 //>>excludeEnd("ctx");
 },
 //>>excludeStart("ide", pragmas.excludeIdeData);
@@ -1005,7 +517,7 @@ referencedClasses: [],
 //>>excludeEnd("ide");
 messageSends: ["basicAt:"]
 }),
-$globals.Behavior);
+$globals.BehaviorBody);
 
 $core.addMethod(
 $core.method({
@@ -1039,7 +551,7 @@ return $recv($1).__lt_eq($recv(b)._selector());
 //>>excludeEnd("ctx");
 }));
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"ownMethods",{},$globals.Behavior)});
+}, function($ctx1) {$ctx1.fill(self,"ownMethods",{},$globals.BehaviorBody)});
 //>>excludeEnd("ctx");
 },
 //>>excludeStart("ide", pragmas.excludeIdeData);
@@ -1049,7 +561,7 @@ referencedClasses: ["OrderedCollection"],
 //>>excludeEnd("ide");
 messageSends: ["sorted:", "inject:into:", "ownProtocols", "new", ",", "methodsInProtocol:", "<=", "selector"]
 }),
-$globals.Behavior);
+$globals.BehaviorBody);
 
 $core.addMethod(
 $core.method({
@@ -1070,7 +582,7 @@ return $recv(each)._match_("^\x5c*");
 //>>excludeEnd("ctx");
 }));
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"ownProtocols",{},$globals.Behavior)});
+}, function($ctx1) {$ctx1.fill(self,"ownProtocols",{},$globals.BehaviorBody)});
 //>>excludeEnd("ctx");
 },
 //>>excludeStart("ide", pragmas.excludeIdeData);
@@ -1080,7 +592,7 @@ referencedClasses: [],
 //>>excludeEnd("ide");
 messageSends: ["reject:", "protocols", "match:"]
 }),
-$globals.Behavior);
+$globals.BehaviorBody);
 
 $core.addMethod(
 $core.method({
@@ -1101,7 +613,7 @@ return nil;
 
 }));
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"packageOfProtocol:",{aString:aString},$globals.Behavior)});
+}, function($ctx1) {$ctx1.fill(self,"packageOfProtocol:",{aString:aString},$globals.BehaviorBody)});
 //>>excludeEnd("ctx");
 },
 //>>excludeStart("ide", pragmas.excludeIdeData);
@@ -1111,7 +623,7 @@ referencedClasses: ["Package"],
 //>>excludeEnd("ide");
 messageSends: ["ifFalse:", "beginsWith:", "package", "named:ifAbsent:", "allButFirst"]
 }),
-$globals.Behavior);
+$globals.BehaviorBody);
 
 $core.addMethod(
 $core.method({
@@ -1124,7 +636,7 @@ return $core.withContext(function($ctx1) {
 //>>excludeEnd("ctx");
 return $recv($recv(self._organization())._elements())._sorted();
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"protocols",{},$globals.Behavior)});
+}, function($ctx1) {$ctx1.fill(self,"protocols",{},$globals.BehaviorBody)});
 //>>excludeEnd("ctx");
 },
 //>>excludeStart("ide", pragmas.excludeIdeData);
@@ -1134,7 +646,7 @@ referencedClasses: [],
 //>>excludeEnd("ide");
 messageSends: ["sorted", "elements", "organization"]
 }),
-$globals.Behavior);
+$globals.BehaviorBody);
 
 $core.addMethod(
 $core.method({
@@ -1178,7 +690,7 @@ return $recv(aBlock)._value_value_(protocol,$recv(methodsByProtocol)._at_(protoc
 }));
 return self;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"protocolsDo:",{aBlock:aBlock,methodsByProtocol:methodsByProtocol},$globals.Behavior)});
+}, function($ctx1) {$ctx1.fill(self,"protocolsDo:",{aBlock:aBlock,methodsByProtocol:methodsByProtocol},$globals.BehaviorBody)});
 //>>excludeEnd("ctx");
 },
 //>>excludeStart("ide", pragmas.excludeIdeData);
@@ -1188,31 +700,7 @@ referencedClasses: ["HashedCollection", "Array"],
 //>>excludeEnd("ide");
 messageSends: ["new", "valuesDo:", "methodDictionary", "add:", "at:ifAbsentPut:", "protocol", "do:", "protocols", "value:value:", "at:"]
 }),
-$globals.Behavior);
-
-$core.addMethod(
-$core.method({
-selector: "prototype",
-protocol: 'accessing',
-fn: function (){
-var self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-return self.fn.prototype;
-return self;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"prototype",{},$globals.Behavior)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: [],
-source: "prototype\x0a\x09<inlineJS: 'return self.fn.prototype'>",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: []
-}),
-$globals.Behavior);
+$globals.BehaviorBody);
 
 $core.addMethod(
 $core.method({
@@ -1225,7 +713,7 @@ return $core.withContext(function($ctx1) {
 //>>excludeEnd("ctx");
 return $recv($recv($globals.Compiler)._new())._recompile_(self);
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"recompile",{},$globals.Behavior)});
+}, function($ctx1) {$ctx1.fill(self,"recompile",{},$globals.BehaviorBody)});
 //>>excludeEnd("ctx");
 },
 //>>excludeStart("ide", pragmas.excludeIdeData);
@@ -1235,7 +723,7 @@ referencedClasses: ["Compiler"],
 //>>excludeEnd("ide");
 messageSends: ["recompile:", "new"]
 }),
-$globals.Behavior);
+$globals.BehaviorBody);
 
 $core.addMethod(
 $core.method({
@@ -1256,7 +744,7 @@ $2=$recv($3)._yourself();
 $recv($1)._announce_($2);
 return self;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"removeCompiledMethod:",{aMethod:aMethod},$globals.Behavior)});
+}, function($ctx1) {$ctx1.fill(self,"removeCompiledMethod:",{aMethod:aMethod},$globals.BehaviorBody)});
 //>>excludeEnd("ctx");
 },
 //>>excludeStart("ide", pragmas.excludeIdeData);
@@ -1266,7 +754,7 @@ referencedClasses: ["SystemAnnouncer", "MethodRemoved"],
 //>>excludeEnd("ide");
 messageSends: ["basicRemoveCompiledMethod:", "removeProtocolIfEmpty:", "protocol", "announce:", "current", "method:", "new", "yourself"]
 }),
-$globals.Behavior);
+$globals.BehaviorBody);
 
 $core.addMethod(
 $core.method({
@@ -1296,7 +784,7 @@ return $recv(self._organization())._removeElement_(aString);
 }));
 return self;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"removeProtocolIfEmpty:",{aString:aString},$globals.Behavior)});
+}, function($ctx1) {$ctx1.fill(self,"removeProtocolIfEmpty:",{aString:aString},$globals.BehaviorBody)});
 //>>excludeEnd("ctx");
 },
 //>>excludeStart("ide", pragmas.excludeIdeData);
@@ -1306,7 +794,7 @@ referencedClasses: [],
 //>>excludeEnd("ide");
 messageSends: ["detect:ifNone:", "methods", "=", "protocol", "removeElement:", "organization"]
 }),
-$globals.Behavior);
+$globals.BehaviorBody);
 
 $core.addMethod(
 $core.method({
@@ -1319,7 +807,7 @@ return $core.withContext(function($ctx1) {
 //>>excludeEnd("ctx");
 return $recv(self._methodDictionary())._keys();
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"selectors",{},$globals.Behavior)});
+}, function($ctx1) {$ctx1.fill(self,"selectors",{},$globals.BehaviorBody)});
 //>>excludeEnd("ctx");
 },
 //>>excludeStart("ide", pragmas.excludeIdeData);
@@ -1329,6 +817,590 @@ referencedClasses: [],
 //>>excludeEnd("ide");
 messageSends: ["keys", "methodDictionary"]
 }),
+$globals.BehaviorBody);
+
+$core.addMethod(
+$core.method({
+selector: "theMetaClass",
+protocol: 'accessing',
+fn: function (){
+var self=this;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+self._subclassResponsibility();
+return self;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"theMetaClass",{},$globals.BehaviorBody)});
+//>>excludeEnd("ctx");
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: [],
+source: "theMetaClass\x0a\x09self subclassResponsibility",
+referencedClasses: [],
+//>>excludeEnd("ide");
+messageSends: ["subclassResponsibility"]
+}),
+$globals.BehaviorBody);
+
+$core.addMethod(
+$core.method({
+selector: "theNonMetaClass",
+protocol: 'accessing',
+fn: function (){
+var self=this;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+self._subclassResponsibility();
+return self;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"theNonMetaClass",{},$globals.BehaviorBody)});
+//>>excludeEnd("ctx");
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: [],
+source: "theNonMetaClass\x0a\x09self subclassResponsibility",
+referencedClasses: [],
+//>>excludeEnd("ide");
+messageSends: ["subclassResponsibility"]
+}),
+$globals.BehaviorBody);
+
+
+
+$core.addClass('Behavior', $globals.BehaviorBody, [], 'Kernel-Classes');
+//>>excludeStart("ide", pragmas.excludeIdeData);
+$globals.Behavior.comment="I am the superclass of all class objects.\x0a\x0aIn addition to BehaviorBody, I define superclass/subclass relationships and instantiation.\x0a\x0aI define the protocol for creating instances of a class with `#basicNew` and `#new` (see `boot.js` for class constructors details).\x0a\x0aMy instances know about the subclass/superclass relationships between classes and contain the description that instances are created from.\x0a\x0aI also provide iterating over the class hierarchy.";
+//>>excludeEnd("ide");
+$core.addMethod(
+$core.method({
+selector: "allInstanceVariableNames",
+protocol: 'accessing',
+fn: function (){
+var self=this;
+var result;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+var $1,$receiver;
+result=$recv(self._instanceVariableNames())._copy();
+$1=self._superclass();
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+$ctx1.sendIdx["superclass"]=1;
+//>>excludeEnd("ctx");
+if(($receiver = $1) == null || $receiver.isNil){
+$1;
+} else {
+$recv(result)._addAll_($recv(self._superclass())._allInstanceVariableNames());
+}
+return result;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"allInstanceVariableNames",{result:result},$globals.Behavior)});
+//>>excludeEnd("ctx");
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: [],
+source: "allInstanceVariableNames\x0a\x09| result |\x0a\x09result := self instanceVariableNames copy.\x0a\x09self superclass ifNotNil: [\x0a\x09\x09result addAll: self superclass allInstanceVariableNames ].\x0a\x09^ result",
+referencedClasses: [],
+//>>excludeEnd("ide");
+messageSends: ["copy", "instanceVariableNames", "ifNotNil:", "superclass", "addAll:", "allInstanceVariableNames"]
+}),
+$globals.Behavior);
+
+$core.addMethod(
+$core.method({
+selector: "allSelectors",
+protocol: 'accessing',
+fn: function (){
+var self=this;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+var $1,$2;
+$1=self._allSuperclasses();
+$2=self._selectors();
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+$ctx1.sendIdx["selectors"]=1;
+//>>excludeEnd("ctx");
+return $recv($1)._inject_into_($2,(function(acc,each){
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx2) {
+//>>excludeEnd("ctx");
+$recv(acc)._addAll_($recv(each)._selectors());
+return $recv(acc)._yourself();
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx2) {$ctx2.fillBlock({acc:acc,each:each},$ctx1,1)});
+//>>excludeEnd("ctx");
+}));
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"allSelectors",{},$globals.Behavior)});
+//>>excludeEnd("ctx");
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: [],
+source: "allSelectors\x0a\x09^ self allSuperclasses\x0a\x09\x09inject: self selectors\x0a\x09\x09into: [ :acc :each | acc addAll: each selectors; yourself ]",
+referencedClasses: [],
+//>>excludeEnd("ide");
+messageSends: ["inject:into:", "allSuperclasses", "selectors", "addAll:", "yourself"]
+}),
+$globals.Behavior);
+
+$core.addMethod(
+$core.method({
+selector: "allSubclasses",
+protocol: 'accessing',
+fn: function (){
+var self=this;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+return $recv($globals.Array)._streamContents_((function(str){
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx2) {
+//>>excludeEnd("ctx");
+return self._allSubclassesDo_((function(each){
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx3) {
+//>>excludeEnd("ctx");
+return $recv(str)._nextPut_(each);
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx3) {$ctx3.fillBlock({each:each},$ctx2,2)});
+//>>excludeEnd("ctx");
+}));
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx2) {$ctx2.fillBlock({str:str},$ctx1,1)});
+//>>excludeEnd("ctx");
+}));
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"allSubclasses",{},$globals.Behavior)});
+//>>excludeEnd("ctx");
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: [],
+source: "allSubclasses\x0a\x09\x22Answer an collection of the receiver's and the receiver's descendent's subclasses. \x22\x0a\x0a\x09^ Array streamContents: [ :str | self allSubclassesDo: [ :each | str nextPut: each ] ]",
+referencedClasses: ["Array"],
+//>>excludeEnd("ide");
+messageSends: ["streamContents:", "allSubclassesDo:", "nextPut:"]
+}),
+$globals.Behavior);
+
+$core.addMethod(
+$core.method({
+selector: "allSubclassesDo:",
+protocol: 'enumerating',
+fn: function (aBlock){
+var self=this;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+$core.traverseClassTree(self, function(subclass) {
+	if (subclass !== self) aBlock._value_(subclass);
+});
+return self;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"allSubclassesDo:",{aBlock:aBlock},$globals.Behavior)});
+//>>excludeEnd("ctx");
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: ["aBlock"],
+source: "allSubclassesDo: aBlock\x0a\x09\x22Evaluate the argument, aBlock, for each of the receiver's subclasses.\x22\x0a\x0a<inlineJS: '$core.traverseClassTree(self, function(subclass) {\x0a\x09if (subclass !== self) aBlock._value_(subclass);\x0a})'>",
+referencedClasses: [],
+//>>excludeEnd("ide");
+messageSends: []
+}),
+$globals.Behavior);
+
+$core.addMethod(
+$core.method({
+selector: "allSuperclasses",
+protocol: 'accessing',
+fn: function (){
+var self=this;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+var $1,$3,$2,$receiver;
+$1=self._superclass();
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+$ctx1.sendIdx["superclass"]=1;
+//>>excludeEnd("ctx");
+if(($receiver = $1) == null || $receiver.isNil){
+return [];
+} else {
+$1;
+}
+$3=self._superclass();
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+$ctx1.sendIdx["superclass"]=2;
+//>>excludeEnd("ctx");
+$2=$recv($globals.OrderedCollection)._with_($3);
+$recv($2)._addAll_($recv(self._superclass())._allSuperclasses());
+return $recv($2)._yourself();
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"allSuperclasses",{},$globals.Behavior)});
+//>>excludeEnd("ctx");
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: [],
+source: "allSuperclasses\x0a\x09\x0a\x09self superclass ifNil: [ ^ #() ].\x0a\x09\x0a\x09^ (OrderedCollection with: self superclass)\x0a\x09\x09addAll: self superclass allSuperclasses;\x0a\x09\x09yourself",
+referencedClasses: ["OrderedCollection"],
+//>>excludeEnd("ide");
+messageSends: ["ifNil:", "superclass", "addAll:", "with:", "allSuperclasses", "yourself"]
+}),
+$globals.Behavior);
+
+$core.addMethod(
+$core.method({
+selector: "basicNew",
+protocol: 'instance creation',
+fn: function (){
+var self=this;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+return new self.fn();
+return self;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"basicNew",{},$globals.Behavior)});
+//>>excludeEnd("ctx");
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: [],
+source: "basicNew\x0a\x09<inlineJS: 'return new self.fn()'>",
+referencedClasses: [],
+//>>excludeEnd("ide");
+messageSends: []
+}),
+$globals.Behavior);
+
+$core.addMethod(
+$core.method({
+selector: "canUnderstand:",
+protocol: 'testing',
+fn: function (aSelector){
+var self=this;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+var $2,$1;
+return $recv(self._includesSelector_($recv(aSelector)._asString()))._or_((function(){
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx2) {
+//>>excludeEnd("ctx");
+$2=self._superclass();
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+$ctx2.sendIdx["superclass"]=1;
+//>>excludeEnd("ctx");
+$1=$recv($2)._notNil();
+return $recv($1)._and_((function(){
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx3) {
+//>>excludeEnd("ctx");
+return $recv(self._superclass())._canUnderstand_(aSelector);
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx3) {$ctx3.fillBlock({},$ctx2,2)});
+//>>excludeEnd("ctx");
+}));
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)});
+//>>excludeEnd("ctx");
+}));
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"canUnderstand:",{aSelector:aSelector},$globals.Behavior)});
+//>>excludeEnd("ctx");
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: ["aSelector"],
+source: "canUnderstand: aSelector\x0a\x09^ (self includesSelector: aSelector asString) or: [\x0a\x09\x09self superclass notNil and: [ self superclass canUnderstand: aSelector ]]",
+referencedClasses: [],
+//>>excludeEnd("ide");
+messageSends: ["or:", "includesSelector:", "asString", "and:", "notNil", "superclass", "canUnderstand:"]
+}),
+$globals.Behavior);
+
+$core.addMethod(
+$core.method({
+selector: "definition",
+protocol: 'accessing',
+fn: function (){
+var self=this;
+return "";
+
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: [],
+source: "definition\x0a\x09^ ''",
+referencedClasses: [],
+//>>excludeEnd("ide");
+messageSends: []
+}),
+$globals.Behavior);
+
+$core.addMethod(
+$core.method({
+selector: "includesBehavior:",
+protocol: 'testing',
+fn: function (aClass){
+var self=this;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+return $recv(self.__eq_eq(aClass))._or_((function(){
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx2) {
+//>>excludeEnd("ctx");
+return self._inheritsFrom_(aClass);
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)});
+//>>excludeEnd("ctx");
+}));
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"includesBehavior:",{aClass:aClass},$globals.Behavior)});
+//>>excludeEnd("ctx");
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: ["aClass"],
+source: "includesBehavior: aClass\x0a\x09^ self == aClass or: [\x0a\x09\x09\x09self inheritsFrom: aClass ]",
+referencedClasses: [],
+//>>excludeEnd("ide");
+messageSends: ["or:", "==", "inheritsFrom:"]
+}),
+$globals.Behavior);
+
+$core.addMethod(
+$core.method({
+selector: "inheritsFrom:",
+protocol: 'testing',
+fn: function (aClass){
+var self=this;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+var $1,$3,$2,$receiver;
+$1=self._superclass();
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+$ctx1.sendIdx["superclass"]=1;
+//>>excludeEnd("ctx");
+if(($receiver = $1) == null || $receiver.isNil){
+return false;
+} else {
+$1;
+}
+$3=self._superclass();
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+$ctx1.sendIdx["superclass"]=2;
+//>>excludeEnd("ctx");
+$2=$recv(aClass).__eq_eq($3);
+return $recv($2)._or_((function(){
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx2) {
+//>>excludeEnd("ctx");
+return $recv(self._superclass())._inheritsFrom_(aClass);
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1,2)});
+//>>excludeEnd("ctx");
+}));
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"inheritsFrom:",{aClass:aClass},$globals.Behavior)});
+//>>excludeEnd("ctx");
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: ["aClass"],
+source: "inheritsFrom: aClass\x0a\x09self superclass ifNil: [ ^ false ].\x0a\x0a\x09^ aClass == self superclass or: [ \x0a\x09\x09self superclass inheritsFrom: aClass ]",
+referencedClasses: [],
+//>>excludeEnd("ide");
+messageSends: ["ifNil:", "superclass", "or:", "==", "inheritsFrom:"]
+}),
+$globals.Behavior);
+
+$core.addMethod(
+$core.method({
+selector: "instanceVariableNames",
+protocol: 'accessing',
+fn: function (){
+var self=this;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+return self.iVarNames;
+return self;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"instanceVariableNames",{},$globals.Behavior)});
+//>>excludeEnd("ctx");
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: [],
+source: "instanceVariableNames\x0a\x09<inlineJS: 'return self.iVarNames'>",
+referencedClasses: [],
+//>>excludeEnd("ide");
+messageSends: []
+}),
+$globals.Behavior);
+
+$core.addMethod(
+$core.method({
+selector: "isBehavior",
+protocol: 'testing',
+fn: function (){
+var self=this;
+return true;
+
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: [],
+source: "isBehavior\x0a\x09^ true",
+referencedClasses: [],
+//>>excludeEnd("ide");
+messageSends: []
+}),
+$globals.Behavior);
+
+$core.addMethod(
+$core.method({
+selector: "javascriptConstructor",
+protocol: 'accessing',
+fn: function (){
+var self=this;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+return self.fn;
+return self;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"javascriptConstructor",{},$globals.Behavior)});
+//>>excludeEnd("ctx");
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: [],
+source: "javascriptConstructor\x0a\x09\x22Answer the JS constructor used to instantiate. See boot.js\x22\x0a\x09\x0a\x09<inlineJS: 'return self.fn'>",
+referencedClasses: [],
+//>>excludeEnd("ide");
+messageSends: []
+}),
+$globals.Behavior);
+
+$core.addMethod(
+$core.method({
+selector: "javascriptConstructor:",
+protocol: 'accessing',
+fn: function (aJavaScriptFunction){
+var self=this;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+$core.setClassConstructor(self, aJavaScriptFunction);;
+return self;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"javascriptConstructor:",{aJavaScriptFunction:aJavaScriptFunction},$globals.Behavior)});
+//>>excludeEnd("ctx");
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: ["aJavaScriptFunction"],
+source: "javascriptConstructor: aJavaScriptFunction\x0a\x09\x22Set the JS constructor used to instantiate.\x0a\x09See the JS counter-part in boot.js `$core.setClassConstructor'\x22\x0a\x09\x0a\x09<inlineJS: '$core.setClassConstructor(self, aJavaScriptFunction);'>",
+referencedClasses: [],
+//>>excludeEnd("ide");
+messageSends: []
+}),
+$globals.Behavior);
+
+$core.addMethod(
+$core.method({
+selector: "lookupSelector:",
+protocol: 'accessing',
+fn: function (selector){
+var self=this;
+var lookupClass;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+var $1;
+var $early={};
+try {
+lookupClass=self;
+$recv((function(){
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx2) {
+//>>excludeEnd("ctx");
+return $recv(lookupClass).__eq(nil);
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)});
+//>>excludeEnd("ctx");
+}))._whileFalse_((function(){
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx2) {
+//>>excludeEnd("ctx");
+$1=$recv(lookupClass)._includesSelector_(selector);
+if($core.assert($1)){
+throw $early=[$recv(lookupClass)._methodAt_(selector)];
+}
+lookupClass=$recv(lookupClass)._superclass();
+return lookupClass;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1,2)});
+//>>excludeEnd("ctx");
+}));
+return nil;
+}
+catch(e) {if(e===$early)return e[0]; throw e}
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"lookupSelector:",{selector:selector,lookupClass:lookupClass},$globals.Behavior)});
+//>>excludeEnd("ctx");
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: ["selector"],
+source: "lookupSelector: selector\x0a\x09\x22Look up the given selector in my methodDictionary.\x0a\x09Return the corresponding method if found.\x0a\x09Otherwise chase the superclass chain and try again.\x0a\x09Return nil if no method is found.\x22\x0a\x09\x0a\x09| lookupClass |\x0a\x09\x0a\x09lookupClass := self.\x0a\x09[ lookupClass = nil ] whileFalse: [\x0a\x09\x09(lookupClass includesSelector: selector)\x0a\x09\x09\x09\x09ifTrue: [ ^ lookupClass methodAt: selector ].\x0a\x09\x09\x09lookupClass := lookupClass superclass ].\x0a\x09^ nil",
+referencedClasses: [],
+//>>excludeEnd("ide");
+messageSends: ["whileFalse:", "=", "ifTrue:", "includesSelector:", "methodAt:", "superclass"]
+}),
+$globals.Behavior);
+
+$core.addMethod(
+$core.method({
+selector: "new",
+protocol: 'instance creation',
+fn: function (){
+var self=this;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+return $recv(self._basicNew())._initialize();
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"new",{},$globals.Behavior)});
+//>>excludeEnd("ctx");
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: [],
+source: "new\x0a\x09^ self basicNew initialize",
+referencedClasses: [],
+//>>excludeEnd("ide");
+messageSends: ["initialize", "basicNew"]
+}),
+$globals.Behavior);
+
+$core.addMethod(
+$core.method({
+selector: "prototype",
+protocol: 'accessing',
+fn: function (){
+var self=this;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+return self.fn.prototype;
+return self;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"prototype",{},$globals.Behavior)});
+//>>excludeEnd("ctx");
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: [],
+source: "prototype\x0a\x09<inlineJS: 'return self.fn.prototype'>",
+referencedClasses: [],
+//>>excludeEnd("ide");
+messageSends: []
+}),
 $globals.Behavior);
 
 $core.addMethod(

+ 140 - 111
src/Kernel-Classes.st

@@ -1,52 +1,20 @@
 Smalltalk createPackage: 'Kernel-Classes'!
-Object subclass: #Behavior
+Object subclass: #BehaviorBody
 	instanceVariableNames: ''
 	package: 'Kernel-Classes'!
-!Behavior commentStamp!
-I am the superclass of all class objects.
-
-I define the protocol for creating instances of a class with `#basicNew` and `#new` (see `boot.js` for class constructors details).
+!BehaviorBody commentStamp!
+I am the superclass of all behaviors.
 
-My instances know about the subclass/superclass relationships between classes, contain the description that instances are created from,
-and hold the method dictionary that's associated with each class.
+My instances hold the method dictionary.
 
-I also provides methods for compiling methods, examining the method dictionary, and iterating over the class hierarchy.!
+I also provides methods for compiling methods and examining the method dictionary.!
 
-!Behavior methodsFor: 'accessing'!
+!BehaviorBody methodsFor: 'accessing'!
 
 >> aString
 	^ self methodAt: aString
 !
 
-allInstanceVariableNames
-	| result |
-	result := self instanceVariableNames copy.
-	self superclass ifNotNil: [
-		result addAll: self superclass allInstanceVariableNames ].
-	^ result
-!
-
-allSelectors
-	^ self allSuperclasses
-		inject: self selectors
-		into: [ :acc :each | acc addAll: each selectors; yourself ]
-!
-
-allSubclasses
-	"Answer an collection of the receiver's and the receiver's descendent's subclasses. "
-
-	^ Array streamContents: [ :str | self allSubclassesDo: [ :each | str nextPut: each ] ]
-!
-
-allSuperclasses
-	
-	self superclass ifNil: [ ^ #() ].
-	
-	^ (OrderedCollection with: self superclass)
-		addAll: self superclass allSuperclasses;
-		yourself
-!
-
 comment
 	^ (self basicAt: 'comment') ifNil: [ '' ]
 !
@@ -63,39 +31,6 @@ definition
 	^ ''
 !
 
-instanceVariableNames
-	<inlineJS: 'return self.iVarNames'>
-!
-
-javascriptConstructor
-	"Answer the JS constructor used to instantiate. See boot.js"
-	
-	<inlineJS: 'return self.fn'>
-!
-
-javascriptConstructor: aJavaScriptFunction
-	"Set the JS constructor used to instantiate.
-	See the JS counter-part in boot.js `$core.setClassConstructor'"
-	
-	<inlineJS: '$core.setClassConstructor(self, aJavaScriptFunction);'>
-!
-
-lookupSelector: selector
-	"Look up the given selector in my methodDictionary.
-	Return the corresponding method if found.
-	Otherwise chase the superclass chain and try again.
-	Return nil if no method is found."
-	
-	| lookupClass |
-	
-	lookupClass := self.
-	[ lookupClass = nil ] whileFalse: [
-		(lookupClass includesSelector: selector)
-				ifTrue: [ ^ lookupClass methodAt: selector ].
-			lookupClass := lookupClass superclass ].
-	^ nil
-!
-
 methodAt: aString
 	^ self methodDictionary at: aString
 !
@@ -172,10 +107,6 @@ protocols
 	^ self organization elements sorted
 !
 
-prototype
-	<inlineJS: 'return self.fn.prototype'>
-!
-
 removeProtocolIfEmpty: aString
 	self methods
 		detect: [ :each | each protocol = aString ]
@@ -186,27 +117,15 @@ selectors
 	^ self methodDictionary keys
 !
 
-subclasses
-	self subclassResponsibility
-!
-
-superclass
-	<inlineJS: 'return self.superclass'>
-!
-
 theMetaClass
 	self subclassResponsibility
 !
 
 theNonMetaClass
 	self subclassResponsibility
-!
-
-withAllSubclasses
-	^ (Array with: self) addAll: self allSubclasses; yourself
 ! !
 
-!Behavior methodsFor: 'compiling'!
+!BehaviorBody methodsFor: 'compiling'!
 
 addCompiledMethod: aMethod
 	| oldMethod announcement |
@@ -261,15 +180,7 @@ removeCompiledMethod: aMethod
 			yourself)
 ! !
 
-!Behavior methodsFor: 'enumerating'!
-
-allSubclassesDo: aBlock
-	"Evaluate the argument, aBlock, for each of the receiver's subclasses."
-
-<inlineJS: '$core.traverseClassTree(self, function(subclass) {
-	if (subclass !!== self) aBlock._value_(subclass);
-})'>
-!
+!BehaviorBody methodsFor: 'enumerating'!
 
 protocolsDo: aBlock
 	"Execute aBlock for each method protocol with
@@ -284,24 +195,146 @@ protocolsDo: aBlock
 		aBlock value: protocol value: (methodsByProtocol at: protocol) ]
 ! !
 
-!Behavior methodsFor: 'instance creation'!
+!BehaviorBody methodsFor: 'private'!
 
-basicNew
-	<inlineJS: 'return new self.fn()'>
+basicAddCompiledMethod: aMethod
+	<inlineJS: '$core.addMethod(aMethod, self)'>
 !
 
-new
-	^ self basicNew initialize
+basicRemoveCompiledMethod: aMethod
+	<inlineJS: '$core.removeMethod(aMethod,self)'>
 ! !
 
-!Behavior methodsFor: 'private'!
+!BehaviorBody methodsFor: 'testing'!
 
-basicAddCompiledMethod: aMethod
-	<inlineJS: '$core.addMethod(aMethod, self)'>
+includesSelector: aString
+	^ self methodDictionary includesKey: aString
+! !
+
+BehaviorBody subclass: #Behavior
+	instanceVariableNames: ''
+	package: 'Kernel-Classes'!
+!Behavior commentStamp!
+I am the superclass of all class objects.
+
+In addition to BehaviorBody, I define superclass/subclass relationships and instantiation.
+
+I define the protocol for creating instances of a class with `#basicNew` and `#new` (see `boot.js` for class constructors details).
+
+My instances know about the subclass/superclass relationships between classes and contain the description that instances are created from.
+
+I also provide iterating over the class hierarchy.!
+
+!Behavior methodsFor: 'accessing'!
+
+allInstanceVariableNames
+	| result |
+	result := self instanceVariableNames copy.
+	self superclass ifNotNil: [
+		result addAll: self superclass allInstanceVariableNames ].
+	^ result
 !
 
-basicRemoveCompiledMethod: aMethod
-	<inlineJS: '$core.removeMethod(aMethod,self)'>
+allSelectors
+	^ self allSuperclasses
+		inject: self selectors
+		into: [ :acc :each | acc addAll: each selectors; yourself ]
+!
+
+allSubclasses
+	"Answer an collection of the receiver's and the receiver's descendent's subclasses. "
+
+	^ Array streamContents: [ :str | self allSubclassesDo: [ :each | str nextPut: each ] ]
+!
+
+allSuperclasses
+	
+	self superclass ifNil: [ ^ #() ].
+	
+	^ (OrderedCollection with: self superclass)
+		addAll: self superclass allSuperclasses;
+		yourself
+!
+
+definition
+	^ ''
+!
+
+instanceVariableNames
+	<inlineJS: 'return self.iVarNames'>
+!
+
+javascriptConstructor
+	"Answer the JS constructor used to instantiate. See boot.js"
+	
+	<inlineJS: 'return self.fn'>
+!
+
+javascriptConstructor: aJavaScriptFunction
+	"Set the JS constructor used to instantiate.
+	See the JS counter-part in boot.js `$core.setClassConstructor'"
+	
+	<inlineJS: '$core.setClassConstructor(self, aJavaScriptFunction);'>
+!
+
+lookupSelector: selector
+	"Look up the given selector in my methodDictionary.
+	Return the corresponding method if found.
+	Otherwise chase the superclass chain and try again.
+	Return nil if no method is found."
+	
+	| lookupClass |
+	
+	lookupClass := self.
+	[ lookupClass = nil ] whileFalse: [
+		(lookupClass includesSelector: selector)
+				ifTrue: [ ^ lookupClass methodAt: selector ].
+			lookupClass := lookupClass superclass ].
+	^ nil
+!
+
+prototype
+	<inlineJS: 'return self.fn.prototype'>
+!
+
+subclasses
+	self subclassResponsibility
+!
+
+superclass
+	<inlineJS: 'return self.superclass'>
+!
+
+theMetaClass
+	self subclassResponsibility
+!
+
+theNonMetaClass
+	self subclassResponsibility
+!
+
+withAllSubclasses
+	^ (Array with: self) addAll: self allSubclasses; yourself
+! !
+
+!Behavior methodsFor: 'enumerating'!
+
+allSubclassesDo: aBlock
+	"Evaluate the argument, aBlock, for each of the receiver's subclasses."
+
+<inlineJS: '$core.traverseClassTree(self, function(subclass) {
+	if (subclass !!== self) aBlock._value_(subclass);
+})'>
+! !
+
+!Behavior methodsFor: 'instance creation'!
+
+basicNew
+	<inlineJS: 'return new self.fn()'>
+!
+
+new
+	^ self basicNew initialize
 ! !
 
 !Behavior methodsFor: 'testing'!
@@ -316,10 +349,6 @@ includesBehavior: aClass
 			self inheritsFrom: aClass ]
 !
 
-includesSelector: aString
-	^ self methodDictionary includesKey: aString
-!
-
 inheritsFrom: aClass
 	self superclass ifNil: [ ^ false ].
 

+ 24 - 24
src/Platform-ImportExport.js

@@ -4499,30 +4499,6 @@ messageSends: ["commentStamp"]
 }),
 $globals.Behavior);
 
-$core.addMethod(
-$core.method({
-selector: "exportBehaviorDefinitionTo:using:",
-protocol: '*Platform-ImportExport',
-fn: function (aStream,anExporter){
-var self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-self._subclassResponsibility();
-return self;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"exportBehaviorDefinitionTo:using:",{aStream:aStream,anExporter:anExporter},$globals.Behavior)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: ["aStream", "anExporter"],
-source: "exportBehaviorDefinitionTo: aStream using: anExporter\x0a\x09self subclassResponsibility",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: ["subclassResponsibility"]
-}),
-$globals.Behavior);
-
 $core.addMethod(
 $core.method({
 selector: "methodsFor:",
@@ -4572,6 +4548,30 @@ messageSends: ["methodsFor:"]
 }),
 $globals.Behavior);
 
+$core.addMethod(
+$core.method({
+selector: "exportBehaviorDefinitionTo:using:",
+protocol: '*Platform-ImportExport',
+fn: function (aStream,anExporter){
+var self=this;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+self._subclassResponsibility();
+return self;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"exportBehaviorDefinitionTo:using:",{aStream:aStream,anExporter:anExporter},$globals.BehaviorBody)});
+//>>excludeEnd("ctx");
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: ["aStream", "anExporter"],
+source: "exportBehaviorDefinitionTo: aStream using: anExporter\x0a\x09self subclassResponsibility",
+referencedClasses: [],
+//>>excludeEnd("ide");
+messageSends: ["subclassResponsibility"]
+}),
+$globals.BehaviorBody);
+
 $core.addMethod(
 $core.method({
 selector: "exportBehaviorDefinitionTo:using:",

+ 6 - 4
src/Platform-ImportExport.st

@@ -1118,10 +1118,6 @@ commentStamp: aStamp prior: prior
 		^ self commentStamp
 !
 
-exportBehaviorDefinitionTo: aStream using: anExporter
-	self subclassResponsibility
-!
-
 methodsFor: aString
 	^ ClassProtocolReader new
 		class: self category: aString;
@@ -1133,6 +1129,12 @@ methodsFor: aString stamp: aStamp
 	^ self methodsFor: aString
 ! !
 
+!BehaviorBody methodsFor: '*Platform-ImportExport'!
+
+exportBehaviorDefinitionTo: aStream using: anExporter
+	self subclassResponsibility
+! !
+
 !Class methodsFor: '*Platform-ImportExport'!
 
 exportBehaviorDefinitionTo: aStream using: anExporter

+ 7 - 2
support/boot.js

@@ -242,6 +242,9 @@ define(['require', './brikz', './compatibility'], function (require, Brikz) {
         var SmalltalkObject = brikz.root.Object;
         nilAsClass.klass = {fn: SmalltalkClass};
 
+        function SmalltalkBehaviorBody () {
+        }
+
         function SmalltalkBehavior () {
         }
 
@@ -251,7 +254,8 @@ define(['require', './brikz', './compatibility'], function (require, Brikz) {
         function SmalltalkMetaclass () {
         }
 
-        inherits(SmalltalkBehavior, SmalltalkObject);
+        inherits(SmalltalkBehaviorBody, SmalltalkObject);
+        inherits(SmalltalkBehavior, SmalltalkBehaviorBody);
         inherits(SmalltalkClass, SmalltalkBehavior);
         inherits(SmalltalkMetaclass, SmalltalkBehavior);
 
@@ -279,7 +283,8 @@ define(['require', './brikz', './compatibility'], function (require, Brikz) {
             var globals = brikz.smalltalkGlobals.globals;
             var addCoupledClass = brikz.classes.addCoupledClass;
             st.addPackage("Kernel-Classes");
-            addCoupledClass("Behavior", globals.Object, "Kernel-Classes", SmalltalkBehavior);
+            addCoupledClass("BehaviorBody", globals.Object, "Kernel-Classes", SmalltalkBehaviorBody);
+            addCoupledClass("Behavior", globals.BehaviorBody, "Kernel-Classes", SmalltalkBehavior);
             addCoupledClass("Metaclass", globals.Behavior, "Kernel-Classes", SmalltalkMetaclass);
             addCoupledClass("Class", globals.Behavior, "Kernel-Classes", SmalltalkClass);