| 
					
				 | 
			
			
				@@ -124,24 +124,33 @@ function Smalltalk() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     var classes = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     var wrappedClasses = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    /* Method not implemented handlers selectors */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /* Method not implemented handlers */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    var dnuHandlers = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var dnu = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		methods: [], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		selectors: [], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    function addDnuHandler(string) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if(dnuHandlers.indexOf(string) == -1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            dnuHandlers.push(string); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	/* Dnu handler method */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    function dnu(selector) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return function() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            var args = Array.prototype.slice.call(arguments); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return messageNotUnderstood(this, selector, args); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		get: function (string) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			var index = this.selectors.indexOf(string); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if(index !== -1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				return this.methods[index]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			this.selectors.push(string); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			var selector = st.selector(string); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			var method = {jsSelector: selector, fn: this.createHandler(selector)}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			this.methods.push(method); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return method; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		/* Dnu handler method */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		createHandler: function (selector) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return function () { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				var args = Array.prototype.slice.call(arguments); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				return messageNotUnderstood(this, selector, args); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	/* The symbol table ensures symbol unicity */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -307,6 +316,12 @@ function Smalltalk() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	function installMethodIfAbsent(method, klass) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if(!klass.fn.prototype[method.jsSelector]) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			installMethod(method, klass); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	function reinstallMethods(klass) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         for(var keys = Object.keys(klass.methods), i=0; i<keys.length; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             installMethod(klass.methods[keys[i]], klass); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -314,25 +329,16 @@ function Smalltalk() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	function installDnuHandlers(klass) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        for(var i=0; i<dnuHandlers.length; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            installDnuHandler(dnuHandlers[i], klass); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		var m = dnu.methods; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for(var i=0; i<m.length; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			installMethodIfAbsent(m[i], klass); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	function installDnuHandler(string, klass) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        var selector = st.selector(string); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if(!klass.fn.prototype[selector]) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			installMethod({jsSelector: selector, fn: dnu(selector)}, klass); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	function installNewDnuHandler(string) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if(dnuHandlers.indexOf(string) === -1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            addDnuHandler(string); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            installDnuHandler(string, st.Object); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            for(var i=0; i<wrappedClasses.length; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                installDnuHandler(string, wrappedClasses[i]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	function installNewDnuHandler(newHandler) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		installMethodIfAbsent(newHandler, st.Object); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		for(var i = 0; i < wrappedClasses.length; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			installMethodIfAbsent(newHandler, wrappedClasses[i]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -469,9 +475,9 @@ function Smalltalk() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         klass.organization.elements.addElement(method.category); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         for(var i=0; i<method.messageSends.length; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            addDnuHandler(method.messageSends[i]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var dnuHandler = dnu.get(method.messageSends[i]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if(initialized) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                installNewDnuHandler(method.messageSends[i]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                installNewDnuHandler(dnuHandler); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	}; 
			 |