|  | @@ -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);
 | 
	
		
			
				|  |  |  			}
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  	};
 |