|  | @@ -311,16 +311,30 @@ function Smalltalk() {
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	function copySuperclass(klass, superclass) {
 | 
	
		
			
				|  |  | +		var inheritedMethods = {};
 | 
	
		
			
				|  |  |  		deinstallAllMethods(klass);
 | 
	
		
			
				|  |  | -		klass.inheritedMethods = {};
 | 
	
		
			
				|  |  |  		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]], klass);
 | 
	
		
			
				|  |  | +				inheritMethodIfAbsent(superclass.methods[keys[i]]);
 | 
	
		
			
				|  |  |  			}
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  		reinstallMethods(klass);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		function inheritMethodIfAbsent(method) {
 | 
	
		
			
				|  |  | +			var selector = method.selector;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			//TODO: prepare klass methods into inheritedMethods to only test once
 | 
	
		
			
				|  |  | +			//TODO: Object.create(null) to ditch hasOwnProperty call (very slow)
 | 
	
		
			
				|  |  | +			if(klass.methods.hasOwnProperty(selector) || inheritedMethods.hasOwnProperty(selector)) {
 | 
	
		
			
				|  |  | +				return;
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			installMethod(method, klass);
 | 
	
		
			
				|  |  | +			inheritedMethods[method.selector] = true;
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	function installMethod(method, klass) {
 | 
	
	
		
			
				|  | @@ -330,17 +344,6 @@ function Smalltalk() {
 | 
	
		
			
				|  |  |  		});
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	function inheritMethodIfAbsent(method, klass) {
 | 
	
		
			
				|  |  | -		var selector = method.selector;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -		if(klass.methods.hasOwnProperty(selector) || klass.inheritedMethods.hasOwnProperty(selector)) {
 | 
	
		
			
				|  |  | -			return;
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -		installMethod(method, klass);
 | 
	
		
			
				|  |  | -		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++) {
 |