|  | @@ -176,97 +176,6 @@ define(['require', './brikz.umd', './compatibility'], function (require, Brikz)
 | 
	
		
			
				|  |  |          };
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    var DNUBrik = depends(["messageSend", "manipulation", "root"], function (brikz, st) {
 | 
	
		
			
				|  |  | -        var installJSMethod = brikz.manipulation.installJSMethod;
 | 
	
		
			
				|  |  | -        var RootProto = brikz.root.rootAsClass.fn.prototype;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        /* Method not implemented handlers */
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        this.makeDnuHandler = function (pair, targetClasses) {
 | 
	
		
			
				|  |  | -            var jsSelector = pair.js;
 | 
	
		
			
				|  |  | -            var fn = createHandler(pair.st);
 | 
	
		
			
				|  |  | -            installJSMethod(RootProto, jsSelector, fn);
 | 
	
		
			
				|  |  | -            targetClasses.forEach(function (target) {
 | 
	
		
			
				|  |  | -                installJSMethod(target.fn.prototype, jsSelector, fn);
 | 
	
		
			
				|  |  | -            });
 | 
	
		
			
				|  |  | -        };
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        /* Dnu handler method */
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        function createHandler(stSelector) {
 | 
	
		
			
				|  |  | -            return function () {
 | 
	
		
			
				|  |  | -                return brikz.messageSend.messageNotUnderstood(this, stSelector, arguments);
 | 
	
		
			
				|  |  | -            };
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -    });
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    var ClassInitBrik = depends(["selectors", "manipulation"], function (brikz, st) {
 | 
	
		
			
				|  |  | -        var selectors = brikz.selectors;
 | 
	
		
			
				|  |  | -        var wireKlass = brikz.manipulation.wireKlass;
 | 
	
		
			
				|  |  | -        var installMethod = brikz.manipulation.installMethod;
 | 
	
		
			
				|  |  | -        var installJSMethod = brikz.manipulation.installJSMethod;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        /* Initialize a class in its class hierarchy. Handle both classes and
 | 
	
		
			
				|  |  | -         metaclasses. */
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        st.init = function (klass) {
 | 
	
		
			
				|  |  | -            initClass(klass);
 | 
	
		
			
				|  |  | -            if (klass.klass && !klass.meta) {
 | 
	
		
			
				|  |  | -                initClass(klass.klass);
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -        };
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        function initClass(klass) {
 | 
	
		
			
				|  |  | -            wireKlass(klass);
 | 
	
		
			
				|  |  | -            if (klass.detachedRoot) {
 | 
	
		
			
				|  |  | -                copySuperclass(klass);
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -            installMethods(klass);
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        this.initClass = initClass;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        function copySuperclass(klass) {
 | 
	
		
			
				|  |  | -            var myproto = klass.fn.prototype,
 | 
	
		
			
				|  |  | -                superproto = klass.superclass.fn.prototype;
 | 
	
		
			
				|  |  | -            selectors.selectorPairs.forEach(function (selectorPair) {
 | 
	
		
			
				|  |  | -                var jsSelector = selectorPair.js;
 | 
	
		
			
				|  |  | -                installJSMethod(myproto, jsSelector, superproto[jsSelector]);
 | 
	
		
			
				|  |  | -            });
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        function installMethods(klass) {
 | 
	
		
			
				|  |  | -            var methods = klass.methods;
 | 
	
		
			
				|  |  | -            Object.keys(methods).forEach(function (selector) {
 | 
	
		
			
				|  |  | -                installMethod(methods[selector], klass);
 | 
	
		
			
				|  |  | -            });
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -    });
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    function ManipulationBrik(brikz, st) {
 | 
	
		
			
				|  |  | -        function wireKlass(klass) {
 | 
	
		
			
				|  |  | -            Object.defineProperty(klass.fn.prototype, "klass", {
 | 
	
		
			
				|  |  | -                value: klass,
 | 
	
		
			
				|  |  | -                enumerable: false, configurable: true, writable: true
 | 
	
		
			
				|  |  | -            });
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        function installJSMethod(obj, jsSelector, fn) {
 | 
	
		
			
				|  |  | -            Object.defineProperty(obj, jsSelector, {
 | 
	
		
			
				|  |  | -                value: fn,
 | 
	
		
			
				|  |  | -                enumerable: false, configurable: true, writable: true
 | 
	
		
			
				|  |  | -            });
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        function installMethod(method, klass) {
 | 
	
		
			
				|  |  | -            installJSMethod(klass.fn.prototype, method.jsSelector, method.fn);
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        this.wireKlass = wireKlass;
 | 
	
		
			
				|  |  | -        this.installMethod = installMethod;
 | 
	
		
			
				|  |  | -        this.installJSMethod = installJSMethod;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |      var PackagesBrik = depends(["organize", "root"], function (brikz, st) {
 | 
	
		
			
				|  |  |          var setupPackageOrganization = brikz.organize.setupPackageOrganization;
 | 
	
		
			
				|  |  |          var SmalltalkObject = brikz.root.Object;
 | 
	
	
		
			
				|  | @@ -316,13 +225,11 @@ define(['require', './brikz.umd', './compatibility'], function (require, Brikz)
 | 
	
		
			
				|  |  |          };
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    var ClassesBrik = depends(["organize", "manipulation", "root", "smalltalkGlobals", "classInit"], function (brikz, st) {
 | 
	
		
			
				|  |  | +    var ClassesBrik = depends(["organize", "root", "smalltalkGlobals"], function (brikz, st) {
 | 
	
		
			
				|  |  |          var setupClassOrganization = brikz.organize.setupClassOrganization;
 | 
	
		
			
				|  |  |          var addOrganizationElement = brikz.organize.addOrganizationElement;
 | 
	
		
			
				|  |  |          var removeOrganizationElement = brikz.organize.removeOrganizationElement;
 | 
	
		
			
				|  |  | -        var wireKlass = brikz.manipulation.wireKlass;
 | 
	
		
			
				|  |  |          var globals = brikz.smalltalkGlobals.globals;
 | 
	
		
			
				|  |  | -        var initClass = brikz.classInit.initClass;
 | 
	
		
			
				|  |  |          var rootAsClass = brikz.root.rootAsClass;
 | 
	
		
			
				|  |  |          var SmalltalkObject = brikz.root.Object;
 | 
	
		
			
				|  |  |          rootAsClass.klass = {fn: SmalltalkClass};
 | 
	
	
		
			
				|  | @@ -413,6 +320,15 @@ define(['require', './brikz.umd', './compatibility'], function (require, Brikz)
 | 
	
		
			
				|  |  |              });
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        function wireKlass(klass) {
 | 
	
		
			
				|  |  | +            Object.defineProperty(klass.fn.prototype, "klass", {
 | 
	
		
			
				|  |  | +                value: klass,
 | 
	
		
			
				|  |  | +                enumerable: false, configurable: true, writable: true
 | 
	
		
			
				|  |  | +            });
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        this.wireKlass = wireKlass;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          /* Add a class to the smalltalk object, creating a new one if needed.
 | 
	
		
			
				|  |  |           A Package is lazily created if it does not exist with given name. */
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -500,18 +416,12 @@ define(['require', './brikz.umd', './compatibility'], function (require, Brikz)
 | 
	
		
			
				|  |  |              klass.detachedRoot = true;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        this.markClassDetachedRoot = markClassDetachedRoot;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          st.addCoupledClass = function (className, superclass, pkgName, fn) {
 | 
	
		
			
				|  |  |              return rawAddClass(pkgName, className, superclass, null, fn);
 | 
	
		
			
				|  |  |          };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        /* Manually set the constructor of an existing Smalltalk klass, making it a detached root class. */
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        st.setClassConstructor = function (klass, constructor) {
 | 
	
		
			
				|  |  | -            markClassDetachedRoot(klass);
 | 
	
		
			
				|  |  | -            klass.fn = constructor;
 | 
	
		
			
				|  |  | -            initClass(klass);
 | 
	
		
			
				|  |  | -        };
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |          /* Create an alias for an existing class */
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          st.alias = function (klass, alias) {
 | 
	
	
		
			
				|  | @@ -521,7 +431,7 @@ define(['require', './brikz.umd', './compatibility'], function (require, Brikz)
 | 
	
		
			
				|  |  |          /* Answer all registered Smalltalk classes */
 | 
	
		
			
				|  |  |          //TODO: remove the function and make smalltalk.classes an array
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        st.classes = function () {
 | 
	
		
			
				|  |  | +        st.classes = this.classes = function () {
 | 
	
		
			
				|  |  |              return classes;
 | 
	
		
			
				|  |  |          };
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -552,15 +462,10 @@ define(['require', './brikz.umd', './compatibility'], function (require, Brikz)
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    var MethodsBrik = depends(["manipulation", "organize", "stInit", "selectors", "dnu", "root", "selectorConversion", "classes"], function (brikz, st) {
 | 
	
		
			
				|  |  | -        var installMethod = brikz.manipulation.installMethod;
 | 
	
		
			
				|  |  | -        var installJSMethod = brikz.manipulation.installJSMethod;
 | 
	
		
			
				|  |  | +    var MethodsBrik = depends(["organize", "selectors", "root", "selectorConversion"], function (brikz, st) {
 | 
	
		
			
				|  |  |          var addOrganizationElement = brikz.organize.addOrganizationElement;
 | 
	
		
			
				|  |  | -        var initialized = brikz.stInit.initialized;
 | 
	
		
			
				|  |  |          var registerSelector = brikz.selectors.registerSelector;
 | 
	
		
			
				|  |  | -        var makeDnuHandler = brikz.dnu.makeDnuHandler;
 | 
	
		
			
				|  |  |          var SmalltalkObject = brikz.root.Object;
 | 
	
		
			
				|  |  | -        var detachedRootClasses = brikz.classes.detachedRootClasses;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          function SmalltalkMethod() {
 | 
	
		
			
				|  |  |          }
 | 
	
	
		
			
				|  | @@ -612,35 +517,10 @@ define(['require', './brikz.umd', './compatibility'], function (require, Brikz)
 | 
	
		
			
				|  |  |              selectorInUse(method.selector);
 | 
	
		
			
				|  |  |              method.messageSends.forEach(selectorInUse);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            var targetClasses = [];
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            if (initialized()) {
 | 
	
		
			
				|  |  | -                installMethod(method, klass);
 | 
	
		
			
				|  |  | -                propagateMethodChange(klass, method, klass);
 | 
	
		
			
				|  |  | -                targetClasses = detachedRootClasses();
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            newSelectors.forEach(function (pair) {
 | 
	
		
			
				|  |  | -                makeDnuHandler(pair, targetClasses);
 | 
	
		
			
				|  |  | -            });
 | 
	
		
			
				|  |  | +            st._methodAdded && st._methodAdded(method, klass);
 | 
	
		
			
				|  |  | +            st._selectorsAdded && st._selectorsAdded(newSelectors);
 | 
	
		
			
				|  |  |          };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        function propagateMethodChange(klass, method, exclude) {
 | 
	
		
			
				|  |  | -            var selector = method.selector;
 | 
	
		
			
				|  |  | -            var jsSelector = method.jsSelector;
 | 
	
		
			
				|  |  | -            st.traverseClassTree(klass, function (subclass) {
 | 
	
		
			
				|  |  | -                if (subclass != exclude) {
 | 
	
		
			
				|  |  | -                    initMethodInClass(subclass, selector, jsSelector);
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -            });
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        function initMethodInClass(klass, selector, jsSelector) {
 | 
	
		
			
				|  |  | -            if (klass.detachedRoot && !klass.methods[selector]) {
 | 
	
		
			
				|  |  | -                installJSMethod(klass.fn.prototype, jsSelector, klass.superclass.fn.prototype[jsSelector]);
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |          st.removeMethod = function (method, klass) {
 | 
	
		
			
				|  |  |              if (klass !== method.methodClass) {
 | 
	
		
			
				|  |  |                  throw new Error(
 | 
	
	
		
			
				|  | @@ -650,12 +530,9 @@ define(['require', './brikz.umd', './compatibility'], function (require, Brikz)
 | 
	
		
			
				|  |  |                      klass.className);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            delete klass.fn.prototype[method.jsSelector];
 | 
	
		
			
				|  |  |              delete klass.methods[method.selector];
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            if (initialized()) {
 | 
	
		
			
				|  |  | -                propagateMethodChange(klass, method, null);
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | +            st._methodRemoved && st._methodRemoved(method, klass);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              // Do *not* delete protocols from here.
 | 
	
		
			
				|  |  |              // This is handled by #removeCompiledMethod
 | 
	
	
		
			
				|  | @@ -682,7 +559,7 @@ define(['require', './brikz.umd', './compatibility'], function (require, Brikz)
 | 
	
		
			
				|  |  |          };
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    var SmalltalkInitBrik = depends(["classInit", "classes"], function (brikz, st) {
 | 
	
		
			
				|  |  | +    var SmalltalkInitBrik = depends(["classes"], function (brikz, st) {
 | 
	
		
			
				|  |  |          var initialized = false;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          /* Smalltalk initialization. Called on page load */
 | 
	
	
		
			
				|  | @@ -692,10 +569,6 @@ define(['require', './brikz.umd', './compatibility'], function (require, Brikz)
 | 
	
		
			
				|  |  |                  return;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            st.classes().forEach(function (klass) {
 | 
	
		
			
				|  |  | -                st.init(klass);
 | 
	
		
			
				|  |  | -            });
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |              runnable();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              st.classes().forEach(function (klass) {
 | 
	
	
		
			
				|  | @@ -705,10 +578,6 @@ define(['require', './brikz.umd', './compatibility'], function (require, Brikz)
 | 
	
		
			
				|  |  |              initialized = true;
 | 
	
		
			
				|  |  |          };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        this.initialized = function () {
 | 
	
		
			
				|  |  | -            return initialized;
 | 
	
		
			
				|  |  | -        };
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |          this.__init__ = function () {
 | 
	
		
			
				|  |  |              var globals = brikz.smalltalkGlobals.globals;
 | 
	
		
			
				|  |  |              st.addPackage("Kernel-Methods");
 | 
	
	
		
			
				|  | @@ -740,6 +609,149 @@ define(['require', './brikz.umd', './compatibility'], function (require, Brikz)
 | 
	
		
			
				|  |  |          };
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    var DNUBrik = depends(["selectors", "messageSend", "manipulation", "root"], function (brikz, st) {
 | 
	
		
			
				|  |  | +        var selectorsBrik = brikz.selectors;
 | 
	
		
			
				|  |  | +        var messageNotUnderstood = brikz.messageSend.messageNotUnderstood;
 | 
	
		
			
				|  |  | +        var installJSMethod = brikz.manipulation.installJSMethod;
 | 
	
		
			
				|  |  | +        var RootProto = brikz.root.rootAsClass.fn.prototype;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        /* Method not implemented handlers */
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        function makeDnuHandler(pair, targetClasses) {
 | 
	
		
			
				|  |  | +            var jsSelector = pair.js;
 | 
	
		
			
				|  |  | +            var fn = createHandler(pair.st);
 | 
	
		
			
				|  |  | +            installJSMethod(RootProto, jsSelector, fn);
 | 
	
		
			
				|  |  | +            targetClasses.forEach(function (target) {
 | 
	
		
			
				|  |  | +                installJSMethod(target.fn.prototype, jsSelector, fn);
 | 
	
		
			
				|  |  | +            });
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        this.makeDnuHandler = makeDnuHandler;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        /* Dnu handler method */
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        function createHandler(stSelector) {
 | 
	
		
			
				|  |  | +            return function () {
 | 
	
		
			
				|  |  | +                return messageNotUnderstood(this, stSelector, arguments);
 | 
	
		
			
				|  |  | +            };
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        selectorsBrik.selectorPairs.forEach(function (pair) {
 | 
	
		
			
				|  |  | +            makeDnuHandler(pair, []);
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    function ManipulationBrik(brikz, st) {
 | 
	
		
			
				|  |  | +        function installJSMethod(obj, jsSelector, fn) {
 | 
	
		
			
				|  |  | +            Object.defineProperty(obj, jsSelector, {
 | 
	
		
			
				|  |  | +                value: fn,
 | 
	
		
			
				|  |  | +                enumerable: false, configurable: true, writable: true
 | 
	
		
			
				|  |  | +            });
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        function installMethod(method, klass) {
 | 
	
		
			
				|  |  | +            installJSMethod(klass.fn.prototype, method.jsSelector, method.fn);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        this.installMethod = installMethod;
 | 
	
		
			
				|  |  | +        this.installJSMethod = installJSMethod;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    var RuntimeClassesBrik = depends(["selectors", "dnu", "classes", "manipulation"], function (brikz, st) {
 | 
	
		
			
				|  |  | +        var selectors = brikz.selectors;
 | 
	
		
			
				|  |  | +        var classes = brikz.classes.classes;
 | 
	
		
			
				|  |  | +        var wireKlass = brikz.classes.wireKlass;
 | 
	
		
			
				|  |  | +        var markClassDetachedRoot = brikz.classes.markClassDetachedRoot;
 | 
	
		
			
				|  |  | +        var installMethod = brikz.manipulation.installMethod;
 | 
	
		
			
				|  |  | +        var installJSMethod = brikz.manipulation.installJSMethod;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        /* Initialize a class in its class hierarchy. Handle both classes and
 | 
	
		
			
				|  |  | +         metaclasses. */
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        st.init = function (klass) {
 | 
	
		
			
				|  |  | +            initClass(klass);
 | 
	
		
			
				|  |  | +            if (klass.klass && !klass.meta) {
 | 
	
		
			
				|  |  | +                initClass(klass.klass);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        classes().forEach(function (klass) {
 | 
	
		
			
				|  |  | +            st.init(klass);
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        function initClass(klass) {
 | 
	
		
			
				|  |  | +            wireKlass(klass);
 | 
	
		
			
				|  |  | +            if (klass.detachedRoot) {
 | 
	
		
			
				|  |  | +                copySuperclass(klass);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            installMethods(klass);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        function copySuperclass(klass) {
 | 
	
		
			
				|  |  | +            var myproto = klass.fn.prototype,
 | 
	
		
			
				|  |  | +                superproto = klass.superclass.fn.prototype;
 | 
	
		
			
				|  |  | +            selectors.selectorPairs.forEach(function (selectorPair) {
 | 
	
		
			
				|  |  | +                var jsSelector = selectorPair.js;
 | 
	
		
			
				|  |  | +                installJSMethod(myproto, jsSelector, superproto[jsSelector]);
 | 
	
		
			
				|  |  | +            });
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        function installMethods(klass) {
 | 
	
		
			
				|  |  | +            var methods = klass.methods;
 | 
	
		
			
				|  |  | +            Object.keys(methods).forEach(function (selector) {
 | 
	
		
			
				|  |  | +                installMethod(methods[selector], klass);
 | 
	
		
			
				|  |  | +            });
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        /* Manually set the constructor of an existing Smalltalk klass, making it a detached root class. */
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        st.setClassConstructor = function (klass, constructor) {
 | 
	
		
			
				|  |  | +            markClassDetachedRoot(klass);
 | 
	
		
			
				|  |  | +            klass.fn = constructor;
 | 
	
		
			
				|  |  | +            initClass(klass);
 | 
	
		
			
				|  |  | +        };
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    var RuntimeMethodsBrik = depends(["manipulation", "dnu", "classes"], function (brikz, st) {
 | 
	
		
			
				|  |  | +        var installMethod = brikz.manipulation.installMethod;
 | 
	
		
			
				|  |  | +        var installJSMethod = brikz.manipulation.installJSMethod;
 | 
	
		
			
				|  |  | +        var makeDnuHandler = brikz.dnu.makeDnuHandler;
 | 
	
		
			
				|  |  | +        var detachedRootClasses = brikz.classes.detachedRootClasses;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        st._methodAdded = function (method, klass) {
 | 
	
		
			
				|  |  | +            installMethod(method, klass);
 | 
	
		
			
				|  |  | +            propagateMethodChange(klass, method, klass);
 | 
	
		
			
				|  |  | +        };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        st._selectorsAdded = function (newSelectors) {
 | 
	
		
			
				|  |  | +            var targetClasses = detachedRootClasses();
 | 
	
		
			
				|  |  | +            newSelectors.forEach(function (pair) {
 | 
	
		
			
				|  |  | +                makeDnuHandler(pair, targetClasses);
 | 
	
		
			
				|  |  | +            });
 | 
	
		
			
				|  |  | +        };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        st._methodRemoved = function (method, klass) {
 | 
	
		
			
				|  |  | +            delete klass.fn.prototype[method.jsSelector];
 | 
	
		
			
				|  |  | +            propagateMethodChange(klass, method, null);
 | 
	
		
			
				|  |  | +        };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        function propagateMethodChange(klass, method, exclude) {
 | 
	
		
			
				|  |  | +            var selector = method.selector;
 | 
	
		
			
				|  |  | +            var jsSelector = method.jsSelector;
 | 
	
		
			
				|  |  | +            st.traverseClassTree(klass, function (subclass) {
 | 
	
		
			
				|  |  | +                if (subclass != exclude) {
 | 
	
		
			
				|  |  | +                    initMethodInClass(subclass, selector, jsSelector);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            });
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        function initMethodInClass(klass, selector, jsSelector) {
 | 
	
		
			
				|  |  | +            if (klass.detachedRoot && !klass.methods[selector]) {
 | 
	
		
			
				|  |  | +                installJSMethod(klass.fn.prototype, jsSelector, klass.superclass.fn.prototype[jsSelector]);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      var PrimitivesBrik = depends(["smalltalkGlobals"], function (brikz, st) {
 | 
	
		
			
				|  |  |          var globals = brikz.smalltalkGlobals.globals;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -1148,11 +1160,8 @@ define(['require', './brikz.umd', './compatibility'], function (require, Brikz)
 | 
	
		
			
				|  |  |      brikz.smalltalkGlobals = SmalltalkGlobalsBrik;
 | 
	
		
			
				|  |  |      brikz.root = RootBrik;
 | 
	
		
			
				|  |  |      brikz.selectors = SelectorsBrik;
 | 
	
		
			
				|  |  | -    brikz.dnu = DNUBrik;
 | 
	
		
			
				|  |  |      brikz.organize = OrganizeBrik;
 | 
	
		
			
				|  |  |      brikz.selectorConversion = SelectorConversionBrik;
 | 
	
		
			
				|  |  | -    brikz.classInit = ClassInitBrik;
 | 
	
		
			
				|  |  | -    brikz.manipulation = ManipulationBrik;
 | 
	
		
			
				|  |  |      brikz.packages = PackagesBrik;
 | 
	
		
			
				|  |  |      brikz.classes = ClassesBrik;
 | 
	
		
			
				|  |  |      brikz.methods = MethodsBrik;
 | 
	
	
		
			
				|  | @@ -1166,6 +1175,10 @@ define(['require', './brikz.umd', './compatibility'], function (require, Brikz)
 | 
	
		
			
				|  |  |      /* Making smalltalk that can run */
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      function runnable() {
 | 
	
		
			
				|  |  | +        brikz.dnu = DNUBrik;
 | 
	
		
			
				|  |  | +        brikz.manipulation = ManipulationBrik;
 | 
	
		
			
				|  |  | +        brikz.runtimeClasses = RuntimeClassesBrik;
 | 
	
		
			
				|  |  | +        brikz.runtimeMethods = RuntimeMethodsBrik;
 | 
	
		
			
				|  |  |          brikz.messageSend = MessageSendBrik;
 | 
	
		
			
				|  |  |          brikz.runtime = RuntimeBrik;
 | 
	
		
			
				|  |  |          brikz.primitives = PrimitivesBrik;
 |