Browse Source

Allow method late-binding with `instantiateFn`.

Herby Vojčík 5 years ago
parent
commit
7db232d62c
2 changed files with 6 additions and 2 deletions
  1. 5 1
      lang/base/kernel-fundamentals.js
  2. 1 1
      lang/base/kernel-language.js

+ 5 - 1
lang/base/kernel-fundamentals.js

@@ -137,7 +137,7 @@ define(function () {
         /* Smalltalk method object. To add a method to a class,
          use api.addMethod() */
 
-        st.method = function (spec) {
+        st.method = function (spec, factory) {
             var that = new SmalltalkMethod();
             that.selector = spec.selector;
             that.args = spec.args || [];
@@ -148,6 +148,7 @@ define(function () {
             // TODO remove .referencedClasses, have .referencedGlobals
             that.referencedClasses = spec.referencedClasses || [];
             that.fn = spec.fn;
+            if (factory) that.instantiateFn = factory;
             return that;
         };
 
@@ -206,6 +207,9 @@ define(function () {
                     console.warn("Resetting methodClass of " + newMethod.methodClass.name + " >> " + selector + " to " + traitOrBehavior.name);
                 }
                 newMethod.methodClass = traitOrBehavior;
+                if (newMethod.instantiateFn) {
+                    newMethod.fn = newMethod.instantiateFn(traitOrBehavior);
+                }
                 traitOrBehavior.methods[selector] = newMethod;
                 traitOrBehavior.methodAdded(newMethod);
             } else {

+ 1 - 1
lang/base/kernel-language.js

@@ -92,7 +92,7 @@ define(function () {
         var removeElement = brikz.arraySet.removeElement;
 
         function aliased (selector, method) {
-            var result = st.method(method);
+            var result = st.method(method, method.instantiateFn);
             if (method.selector !== selector) {
                 result.selector = selector;
                 result.source = '"Aliased as ' + selector + '"\n' + method.source;