Browse Source

kernel: Extract to TraitsBrik.

Herbert Vojčík 7 years ago
parent
commit
8810e05d93
1 changed files with 55 additions and 31 deletions
  1. 55 31
      support/boot.js

+ 55 - 31
support/boot.js

@@ -245,9 +245,6 @@ define(['require', './brikz', './compatibility'], function (require, Brikz) {
         function SmalltalkBehavior () {
         }
 
-        function SmalltalkTrait () {
-        }
-
         function SmalltalkClass () {
         }
 
@@ -255,7 +252,6 @@ define(['require', './brikz', './compatibility'], function (require, Brikz) {
         }
 
         inherits(SmalltalkBehavior, SmalltalkObject);
-        inherits(SmalltalkTrait, SmalltalkBehavior);
         inherits(SmalltalkClass, SmalltalkBehavior);
         inherits(SmalltalkMetaclass, SmalltalkBehavior);
 
@@ -263,22 +259,8 @@ define(['require', './brikz', './compatibility'], function (require, Brikz) {
             return 'Smalltalk ' + this.className;
         };
 
-        SmalltalkTrait.prototype.trait = true;
-
         SmalltalkMetaclass.prototype.meta = true;
 
-        SmalltalkTrait.prototype.added = function () {
-            if (st._traitAdded) st._traitAdded(this);
-        };
-
-        SmalltalkTrait.prototype.methodAdded = function (method) {
-            if (st._traitMethodAdded) st._traitMethodAdded(method, this);
-        };
-
-        SmalltalkTrait.prototype.methodRemoved = function (method) {
-            if (st._traitMethodRemoved) st._traitMethodRemoved(method, this);
-        };
-
         SmalltalkClass.prototype.added = function () {
             if (st._classAdded) st._classAdded(this);
         };
@@ -291,6 +273,8 @@ define(['require', './brikz', './compatibility'], function (require, Brikz) {
             if (st._methodRemoved) st._methodRemoved(method, this);
         };
 
+        this.Behavior = SmalltalkBehavior;
+
         this.__init__ = function () {
             var globals = brikz.smalltalkGlobals.globals;
             var addCoupledClass = brikz.classes.addCoupledClass;
@@ -298,7 +282,6 @@ define(['require', './brikz', './compatibility'], function (require, Brikz) {
             addCoupledClass("Behavior", globals.Object, "Kernel-Classes", SmalltalkBehavior);
             addCoupledClass("Metaclass", globals.Behavior, "Kernel-Classes", SmalltalkMetaclass);
             addCoupledClass("Class", globals.Behavior, "Kernel-Classes", SmalltalkClass);
-            addCoupledClass("Trait", globals.Behavior, "Kernel-Classes", SmalltalkTrait);
 
             // Manually bootstrap the metaclass hierarchy
             globals.ProtoObject.klass.superclass = nilAsClass.klass = globals.Class;
@@ -315,13 +298,6 @@ define(['require', './brikz', './compatibility'], function (require, Brikz) {
          should be added to the system, see smalltalk.addClass().
          Superclass linking is *not* handled here, see api.initialize()  */
 
-        function trait (spec) {
-            var that = new SmalltalkTrait();
-            that.className = spec.className;
-            setupClass(that, spec);
-            return that;
-        }
-
         function klass (spec) {
             var setSuperClass = spec.superclass;
             if (!spec.superclass) {
@@ -368,6 +344,8 @@ define(['require', './brikz', './compatibility'], function (require, Brikz) {
             });
         }
 
+        this.setupClass = setupClass;
+
         function wireKlass (klass) {
             Object.defineProperty(klass.fn.prototype, "klass", {
                 value: klass,
@@ -393,11 +371,6 @@ define(['require', './brikz', './compatibility'], function (require, Brikz) {
             "class": klass
         };
 
-        st.addTrait = function (className, pkgName) {
-            return rawAddClass(pkgName, "trait", {className: className});
-        };
-        classFactories.trait = trait;
-
         function rawAddClass (pkgName, type, spec) {
             spec.pkg = st.packages[pkgName];
 
@@ -429,6 +402,8 @@ define(['require', './brikz', './compatibility'], function (require, Brikz) {
             return theClass;
         }
 
+        this.rawAddClass = rawAddClass;
+
         st.removeClass = function (klass) {
             removeOrganizationElement(klass.pkg, klass);
             classes.removeElement(klass);
@@ -565,6 +540,54 @@ define(['require', './brikz', './compatibility'], function (require, Brikz) {
         };
     }
 
+    TraitsBrik.deps = ["classes"];
+    function TraitsBrik (brikz, st) {
+        var SmalltalkBehavior = brikz.classes.Behavior;
+        var setupClass = brikz.classes.setupClass;
+        var rawAddClass = brikz.classes.rawAddClass;
+        var classFactories = brikz.classes.classFactories;
+
+        function SmalltalkTrait () {
+        }
+
+        inherits(SmalltalkTrait, SmalltalkBehavior);
+
+        SmalltalkTrait.prototype.trait = true;
+
+        SmalltalkTrait.prototype.added = function () {
+            if (st._traitAdded) st._traitAdded(this);
+        };
+
+        SmalltalkTrait.prototype.methodAdded = function (method) {
+            if (st._traitMethodAdded) st._traitMethodAdded(method, this);
+        };
+
+        SmalltalkTrait.prototype.methodRemoved = function (method) {
+            if (st._traitMethodRemoved) st._traitMethodRemoved(method, this);
+        };
+
+        this.__init__ = function () {
+            var globals = brikz.smalltalkGlobals.globals;
+            var addCoupledClass = brikz.classes.addCoupledClass;
+            st.addPackage("Kernel-Classes");
+            addCoupledClass("Trait", globals.Behavior, "Kernel-Classes", SmalltalkTrait);
+        };
+        this.__init__.once = true;
+
+        function trait (spec) {
+            var that = new SmalltalkTrait();
+            that.className = spec.className;
+            setupClass(that, spec);
+            return that;
+        }
+
+        classFactories.trait = trait;
+
+        st.addTrait = function (className, pkgName) {
+            return rawAddClass(pkgName, "trait", {className: className});
+        };
+    }
+
     function AugmentsBrik (brikz, st) {
         /* Array extensions */
 
@@ -719,6 +742,7 @@ define(['require', './brikz', './compatibility'], function (require, Brikz) {
     brikz.packages = PackagesBrik;
     brikz.classes = ClassesBrik;
     brikz.methods = MethodsBrik;
+    brikz.traits = TraitsBrik;
     brikz.stInit = SmalltalkInitBrik;
     brikz.augments = AugmentsBrik;
     brikz.asReceiver = AsReceiverBrik;