|  | @@ -223,7 +223,7 @@ define(['require', './compatibility'], function (require) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          /* Method not implemented handlers */
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        var methods = [], methodDict = Object.create(null);
 | 
	
		
			
				|  |  | +        var methodDict = Object.create(null);
 | 
	
		
			
				|  |  |          this.selectors = [];
 | 
	
		
			
				|  |  |          this.jsSelectors = [];
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -235,12 +235,10 @@ define(['require', './compatibility'], function (require) {
 | 
	
		
			
				|  |  |              this.jsSelectors.push(jsSelector);
 | 
	
		
			
				|  |  |              method = {jsSelector: jsSelector, fn: createHandler(stSelector)};
 | 
	
		
			
				|  |  |              methodDict[stSelector] = method;
 | 
	
		
			
				|  |  | -            methods.push(method);
 | 
	
		
			
				|  |  |              manip.installMethod(method, rootAsClass);
 | 
	
		
			
				|  |  |              targetClasses.forEach(function (target) {
 | 
	
		
			
				|  |  |                  manip.installMethod(method, target);
 | 
	
		
			
				|  |  |              });
 | 
	
		
			
				|  |  | -            return method;
 | 
	
		
			
				|  |  |          };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          /* Dnu handler method */
 | 
	
	
		
			
				|  | @@ -286,13 +284,17 @@ define(['require', './compatibility'], function (require) {
 | 
	
		
			
				|  |  |              var myproto = klass.fn.prototype,
 | 
	
		
			
				|  |  |                  superproto = superclass.fn.prototype;
 | 
	
		
			
				|  |  |              dnu.jsSelectors.forEach(function (selector) {
 | 
	
		
			
				|  |  | -                if (!localMethodsByJsSelector[selector]) {
 | 
	
		
			
				|  |  | +                var method = localMethodsByJsSelector[selector];
 | 
	
		
			
				|  |  | +                if (!method) {
 | 
	
		
			
				|  |  |                      manip.installMethod({
 | 
	
		
			
				|  |  |                          jsSelector: selector,
 | 
	
		
			
				|  |  |                          fn: superproto[selector]
 | 
	
		
			
				|  |  |                      }, klass);
 | 
	
		
			
				|  |  | -                } else if (!myproto[selector]) {
 | 
	
		
			
				|  |  | -                    manip.installMethod(localMethodsByJsSelector[selector], klass);
 | 
	
		
			
				|  |  | +                } else if (method.fn !== myproto[selector]) {
 | 
	
		
			
				|  |  | +                    if (myproto[selector]) {
 | 
	
		
			
				|  |  | +                        console.warn("Amber forcefully rewriting method " + selector + " of " + klass.className + ".");
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                    manip.installMethod(method, klass);
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |              });
 | 
	
		
			
				|  |  |          }
 | 
	
	
		
			
				|  | @@ -307,12 +309,10 @@ define(['require', './compatibility'], function (require) {
 | 
	
		
			
				|  |  |          };
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |      function PackagesBrik(brikz, st) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          var org = brikz.ensure("organize");
 | 
	
		
			
				|  |  |          var root = brikz.ensure("root");
 | 
	
		
			
				|  |  | -        var nil = root.nil;
 | 
	
		
			
				|  |  |          var SmalltalkObject = root.Object;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          function SmalltalkPackage() {
 | 
	
	
		
			
				|  | @@ -343,7 +343,7 @@ define(['require', './compatibility'], function (require) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          st.addPackage = function (pkgName, properties) {
 | 
	
		
			
				|  |  |              if (!pkgName) {
 | 
	
		
			
				|  |  | -                return nil;
 | 
	
		
			
				|  |  | +                return null;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              if (!(st.packages[pkgName])) {
 | 
	
		
			
				|  |  |                  st.packages[pkgName] = pkg({
 | 
	
	
		
			
				|  | @@ -364,7 +364,6 @@ define(['require', './compatibility'], function (require) {
 | 
	
		
			
				|  |  |          var org = brikz.ensure("organize");
 | 
	
		
			
				|  |  |          var root = brikz.ensure("root");
 | 
	
		
			
				|  |  |          var classInit = brikz.ensure("classInit");
 | 
	
		
			
				|  |  | -        var nil = root.nil;
 | 
	
		
			
				|  |  |          var rootAsClass = root.rootAsClass;
 | 
	
		
			
				|  |  |          var SmalltalkObject = root.Object;
 | 
	
		
			
				|  |  |          rootAsClass.klass = {fn: SmalltalkClass};
 | 
	
	
		
			
				|  | @@ -382,6 +381,10 @@ define(['require', './compatibility'], function (require) {
 | 
	
		
			
				|  |  |          inherits(SmalltalkClass, SmalltalkBehavior);
 | 
	
		
			
				|  |  |          inherits(SmalltalkMetaclass, SmalltalkBehavior);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        SmalltalkBehavior.prototype.toString = function () {
 | 
	
		
			
				|  |  | +            return 'Smalltalk ' + this.className;
 | 
	
		
			
				|  |  | +        };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          SmalltalkMetaclass.prototype.meta = true;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          this.__init__ = function () {
 | 
	
	
		
			
				|  | @@ -440,10 +443,6 @@ define(['require', './compatibility'], function (require) {
 | 
	
		
			
				|  |  |              return that;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        SmalltalkBehavior.prototype.toString = function () {
 | 
	
		
			
				|  |  | -            return 'Smalltalk ' + this.className;
 | 
	
		
			
				|  |  | -        };
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |          function wireKlass(klass) {
 | 
	
		
			
				|  |  |              Object.defineProperty(klass.fn.prototype, "klass", {
 | 
	
		
			
				|  |  |                  value: klass,
 | 
	
	
		
			
				|  | @@ -470,7 +469,7 @@ define(['require', './compatibility'], function (require) {
 | 
	
		
			
				|  |  |          st.addClass = function (className, superclass, iVarNames, pkgName) {
 | 
	
		
			
				|  |  |              // While subclassing nil is allowed, it might be an error, so
 | 
	
		
			
				|  |  |              // warn about it.
 | 
	
		
			
				|  |  | -            if (typeof superclass == 'undefined' || superclass == nil) {
 | 
	
		
			
				|  |  | +            if (typeof superclass == 'undefined' || superclass && superclass.isNil) {
 | 
	
		
			
				|  |  |                  console.warn('Compiling ' + className + ' as a subclass of `nil`. A dependency might be missing.');
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              rawAddClass(pkgName, className, superclass, iVarNames, false, null);
 | 
	
	
		
			
				|  | @@ -483,7 +482,7 @@ define(['require', './compatibility'], function (require) {
 | 
	
		
			
				|  |  |                  throw new Error("Missing package " + pkgName);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            if (!superclass || superclass == nil) {
 | 
	
		
			
				|  |  | +            if (superclass == null || superclass.isNil) {
 | 
	
		
			
				|  |  |                  superclass = null;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              var theClass = globals.hasOwnProperty(className) && globals[className];
 | 
	
	
		
			
				|  | @@ -572,7 +571,7 @@ define(['require', './compatibility'], function (require) {
 | 
	
		
			
				|  |  |              return classes;
 | 
	
		
			
				|  |  |          };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        st.wrappedClasses = function () {
 | 
	
		
			
				|  |  | +        this.wrappedClasses = function () {
 | 
	
		
			
				|  |  |              return wrappedClasses;
 | 
	
		
			
				|  |  |          };
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -592,7 +591,7 @@ define(['require', './compatibility'], function (require) {
 | 
	
		
			
				|  |  |          var dnu = brikz.ensure("dnu");
 | 
	
		
			
				|  |  |          var SmalltalkObject = brikz.ensure("root").Object;
 | 
	
		
			
				|  |  |          brikz.ensure("selectorConversion");
 | 
	
		
			
				|  |  | -        brikz.ensure("classes");
 | 
	
		
			
				|  |  | +        var classBrik = brikz.ensure("classes");
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          function SmalltalkMethod() {
 | 
	
		
			
				|  |  |          }
 | 
	
	
		
			
				|  | @@ -641,7 +640,7 @@ define(['require', './compatibility'], function (require) {
 | 
	
		
			
				|  |  |              propagateMethodChange(klass, method);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              var usedSelectors = method.messageSends,
 | 
	
		
			
				|  |  | -                targetClasses = stInit.initialized() ? st.wrappedClasses() : [];
 | 
	
		
			
				|  |  | +                targetClasses = stInit.initialized() ? classBrik.wrappedClasses() : [];
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              dnu.make(method.selector, targetClasses);
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -850,7 +849,6 @@ define(['require', './compatibility'], function (require) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          brikz.ensure("selectorConversion");
 | 
	
		
			
				|  |  |          var root = brikz.ensure("root");
 | 
	
		
			
				|  |  | -        var nil = root.nil;
 | 
	
		
			
				|  |  |          var SmalltalkObject = root.Object;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          function SmalltalkMethodContext(home, setup) {
 | 
	
	
		
			
				|  | @@ -934,7 +932,7 @@ define(['require', './compatibility'], function (require) {
 | 
	
		
			
				|  |  |           */
 | 
	
		
			
				|  |  |          st.seamless = function (worker) {
 | 
	
		
			
				|  |  |              return inContext(worker, function (ctx) {
 | 
	
		
			
				|  |  | -                ctx.fill(nil, "seamlessDoIt", {}, globals.UndefinedObject);
 | 
	
		
			
				|  |  | +                ctx.fill(null, "seamlessDoIt", {}, globals.UndefinedObject);
 | 
	
		
			
				|  |  |              });
 | 
	
		
			
				|  |  |          };
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -1014,7 +1012,7 @@ define(['require', './compatibility'], function (require) {
 | 
	
		
			
				|  |  |                  thisContext.init();
 | 
	
		
			
				|  |  |                  return thisContext;
 | 
	
		
			
				|  |  |              } else {
 | 
	
		
			
				|  |  | -                return nil;
 | 
	
		
			
				|  |  | +                return null;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          };
 | 
	
		
			
				|  |  |      }
 | 
	
	
		
			
				|  | @@ -1079,7 +1077,7 @@ define(['require', './compatibility'], function (require) {
 | 
	
		
			
				|  |  |                  return propertyValue.apply(receiver, args || []);
 | 
	
		
			
				|  |  |              } else if (args.length > 0) {
 | 
	
		
			
				|  |  |                  receiver[propertyName] = args[0];
 | 
	
		
			
				|  |  | -                return nil;
 | 
	
		
			
				|  |  | +                return receiver;
 | 
	
		
			
				|  |  |              } else {
 | 
	
		
			
				|  |  |                  return propertyValue;
 | 
	
		
			
				|  |  |              }
 | 
	
	
		
			
				|  | @@ -1093,22 +1091,21 @@ define(['require', './compatibility'], function (require) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          /* Convert a Smalltalk selector into a JS selector */
 | 
	
		
			
				|  |  |          st.st2js = function (string) {
 | 
	
		
			
				|  |  | -            var selector = '_' + string;
 | 
	
		
			
				|  |  | -            selector = selector.replace(/:/g, '_');
 | 
	
		
			
				|  |  | -            selector = selector.replace(/[\&]/g, '_and');
 | 
	
		
			
				|  |  | -            selector = selector.replace(/[\|]/g, '_or');
 | 
	
		
			
				|  |  | -            selector = selector.replace(/[+]/g, '_plus');
 | 
	
		
			
				|  |  | -            selector = selector.replace(/-/g, '_minus');
 | 
	
		
			
				|  |  | -            selector = selector.replace(/[*]/g, '_star');
 | 
	
		
			
				|  |  | -            selector = selector.replace(/[\/]/g, '_slash');
 | 
	
		
			
				|  |  | -            selector = selector.replace(/[\\]/g, '_backslash');
 | 
	
		
			
				|  |  | -            selector = selector.replace(/[\~]/g, '_tild');
 | 
	
		
			
				|  |  | -            selector = selector.replace(/>/g, '_gt');
 | 
	
		
			
				|  |  | -            selector = selector.replace(/</g, '_lt');
 | 
	
		
			
				|  |  | -            selector = selector.replace(/=/g, '_eq');
 | 
	
		
			
				|  |  | -            selector = selector.replace(/,/g, '_comma');
 | 
	
		
			
				|  |  | -            selector = selector.replace(/[@]/g, '_at');
 | 
	
		
			
				|  |  | -            return selector;
 | 
	
		
			
				|  |  | +            return '_' + string
 | 
	
		
			
				|  |  | +                    .replace(/:/g, '_')
 | 
	
		
			
				|  |  | +                    .replace(/[\&]/g, '_and')
 | 
	
		
			
				|  |  | +                    .replace(/[\|]/g, '_or')
 | 
	
		
			
				|  |  | +                    .replace(/[+]/g, '_plus')
 | 
	
		
			
				|  |  | +                    .replace(/-/g, '_minus')
 | 
	
		
			
				|  |  | +                    .replace(/[*]/g, '_star')
 | 
	
		
			
				|  |  | +                    .replace(/[\/]/g, '_slash')
 | 
	
		
			
				|  |  | +                    .replace(/[\\]/g, '_backslash')
 | 
	
		
			
				|  |  | +                    .replace(/[\~]/g, '_tild')
 | 
	
		
			
				|  |  | +                    .replace(/>/g, '_gt')
 | 
	
		
			
				|  |  | +                    .replace(/</g, '_lt')
 | 
	
		
			
				|  |  | +                    .replace(/=/g, '_eq')
 | 
	
		
			
				|  |  | +                    .replace(/,/g, '_comma')
 | 
	
		
			
				|  |  | +                    .replace(/[@]/g, '_at');
 | 
	
		
			
				|  |  |          };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          /* Convert a string to a valid smalltalk selector.
 |