|  | @@ -190,17 +190,18 @@ define("amber/boot", [ 'require', './browser-compatibility' ], function (require
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  		/* Method not implemented handlers */
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -		var methods = [], methodDict = Object.create(null), checker = Object.create(null);
 | 
	
		
			
				|  |  | +		var methods = [], methodDict = Object.create(null);
 | 
	
		
			
				|  |  |  		this.selectors = [];
 | 
	
		
			
				|  |  | +		this.jsSelectors = [];
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  		this.get = function (stSelector) {
 | 
	
		
			
				|  |  |  			var method = methodDict[stSelector];
 | 
	
		
			
				|  |  |  			if(method) {
 | 
	
		
			
				|  |  |  				return method;
 | 
	
		
			
				|  |  |  			}
 | 
	
		
			
				|  |  | -			this.selectors.push(stSelector);
 | 
	
		
			
				|  |  |  			var jsSelector = st.st2js(stSelector);
 | 
	
		
			
				|  |  | -			checker[jsSelector] = true;
 | 
	
		
			
				|  |  | +			this.selectors.push(stSelector);
 | 
	
		
			
				|  |  | +			this.jsSelectors.push(jsSelector);
 | 
	
		
			
				|  |  |  			method = {jsSelector: jsSelector, fn: createHandler(stSelector)};
 | 
	
		
			
				|  |  |  			methodDict[stSelector] = method;
 | 
	
		
			
				|  |  |  			methods.push(method);
 | 
	
	
		
			
				|  | @@ -208,10 +209,6 @@ define("amber/boot", [ 'require', './browser-compatibility' ], function (require
 | 
	
		
			
				|  |  |  			return method;
 | 
	
		
			
				|  |  |  		};
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -		this.isSelector = function (jsSelector) {
 | 
	
		
			
				|  |  | -			return checker[jsSelector];
 | 
	
		
			
				|  |  | -		};
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  		/* Dnu handler method */
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  		function createHandler(stSelector) {
 | 
	
	
		
			
				|  | @@ -219,19 +216,12 @@ define("amber/boot", [ 'require', './browser-compatibility' ], function (require
 | 
	
		
			
				|  |  |  				return brikz.messageSend.messageNotUnderstood(this, stSelector, arguments);
 | 
	
		
			
				|  |  |  			};
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -		this.installHandlers = function (klass) {
 | 
	
		
			
				|  |  | -			for(var i=0; i<methods.length; i++) {
 | 
	
		
			
				|  |  | -				manip.installMethodIfAbsent(methods[i], klass);
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -		};
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	function ClassInitBrik(brikz, st) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  		var dnu = brikz.ensure("dnu");
 | 
	
		
			
				|  |  |  		var manip = brikz.ensure("manipulation");
 | 
	
		
			
				|  |  | -		var nil = brikz.ensure("root").nil;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  		/* Initialize a class in its class hierarchy. Handle both classes and
 | 
	
		
			
				|  |  |  		 metaclasses. */
 | 
	
	
		
			
				|  | @@ -246,46 +236,27 @@ define("amber/boot", [ 'require', './browser-compatibility' ], function (require
 | 
	
		
			
				|  |  |  		function initClass(klass) {
 | 
	
		
			
				|  |  |  			if(klass.wrapped) {
 | 
	
		
			
				|  |  |  				copySuperclass(klass);
 | 
	
		
			
				|  |  | -				dnu.installHandlers(klass);
 | 
	
		
			
				|  |  |  			}
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  		this.initClass = initClass;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -		function copySuperclass(klass, superclass) {
 | 
	
		
			
				|  |  | -			var inheritedMethods = Object.create(null);
 | 
	
		
			
				|  |  | -			deinstallAllMethods(klass);
 | 
	
		
			
				|  |  | -			for (superclass = superclass || klass.superclass;
 | 
	
		
			
				|  |  | -				 superclass && superclass !== nil;
 | 
	
		
			
				|  |  | -				 superclass = superclass.superclass) {
 | 
	
		
			
				|  |  | -				for (var keys = Object.keys(superclass.methods), i = 0; i < keys.length; i++) {
 | 
	
		
			
				|  |  | -					inheritMethodIfAbsent(superclass.methods[keys[i]]);
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -			manip.reinstallMethods(klass);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -			function inheritMethodIfAbsent(method) {
 | 
	
		
			
				|  |  | -				var selector = method.selector;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -				//TODO: prepare klass methods into inheritedMethods to only test once
 | 
	
		
			
				|  |  | -				if(klass.methods[selector] || inheritedMethods[selector]) {
 | 
	
		
			
				|  |  | -					return;
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -				manip.installMethod(method, klass);
 | 
	
		
			
				|  |  | -				inheritedMethods[method.selector] = true;
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -		function deinstallAllMethods(klass) {
 | 
	
		
			
				|  |  | -			var proto = klass.fn.prototype;
 | 
	
		
			
				|  |  | -			for(var keys = Object.getOwnPropertyNames(proto), i=0; i<keys.length; i++) {
 | 
	
		
			
				|  |  | -				var key = keys[i];
 | 
	
		
			
				|  |  | -				if (dnu.isSelector(key)) {
 | 
	
		
			
				|  |  | -					proto[key] = null;
 | 
	
		
			
				|  |  | +		function copySuperclass(klass) {
 | 
	
		
			
				|  |  | +			var superclass = klass.superclass,
 | 
	
		
			
				|  |  | +				localMethods = klass.methods,
 | 
	
		
			
				|  |  | +				protectedJsSelectors = {};
 | 
	
		
			
				|  |  | +			Object.keys(localMethods).forEach(function (each) {
 | 
	
		
			
				|  |  | +				protectedJsSelectors[localMethods[each].jsSelector] = true;
 | 
	
		
			
				|  |  | +			});
 | 
	
		
			
				|  |  | +			var superproto = superclass.fn.prototype;
 | 
	
		
			
				|  |  | +			dnu.jsSelectors.forEach(function (selector) {
 | 
	
		
			
				|  |  | +				if (!protectedJsSelectors[selector]) {
 | 
	
		
			
				|  |  | +					manip.installMethod({
 | 
	
		
			
				|  |  | +						jsSelector: selector,
 | 
	
		
			
				|  |  | +						fn: superproto[selector]
 | 
	
		
			
				|  |  | +					}, klass);
 | 
	
		
			
				|  |  |  				}
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | +			});
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -304,13 +275,6 @@ define("amber/boot", [ 'require', './browser-compatibility' ], function (require
 | 
	
		
			
				|  |  |  			});
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  		this.installMethod = installMethod;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -		this.reinstallMethods = function (klass) {
 | 
	
		
			
				|  |  | -			var methods = klass.methods;
 | 
	
		
			
				|  |  | -			for(var keys = Object.keys(methods), i=0; i<keys.length; i++) {
 | 
	
		
			
				|  |  | -				installMethod(methods[keys[i]], klass);
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -		};
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	function ClassesBrik(brikz, st) {
 |