| 
					
				 | 
			
			
				@@ -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++) { 
			 |