|  | @@ -191,29 +191,29 @@ define("amber/boot", [ 'require', './browser-compatibility' ], function (require
 | 
	
		
			
				|  |  |  		var methods = [], checker = Object.create(null);
 | 
	
		
			
				|  |  |  		this.selectors = [];
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -		this.get = function (string) {
 | 
	
		
			
				|  |  | -			var index = this.selectors.indexOf(string);
 | 
	
		
			
				|  |  | +		this.get = function (stSelector) {
 | 
	
		
			
				|  |  | +			var index = this.selectors.indexOf(stSelector);
 | 
	
		
			
				|  |  |  			if(index !== -1) {
 | 
	
		
			
				|  |  |  				return methods[index];
 | 
	
		
			
				|  |  |  			}
 | 
	
		
			
				|  |  | -			this.selectors.push(string);
 | 
	
		
			
				|  |  | -			var selector = st.selector(string);
 | 
	
		
			
				|  |  | -			checker[selector] = true;
 | 
	
		
			
				|  |  | -			var method = {jsSelector: selector, fn: createHandler(selector)};
 | 
	
		
			
				|  |  | +			this.selectors.push(stSelector);
 | 
	
		
			
				|  |  | +			var jsSelector = st.selector(stSelector);
 | 
	
		
			
				|  |  | +			checker[jsSelector] = true;
 | 
	
		
			
				|  |  | +			var method = {jsSelector: jsSelector, fn: createHandler(stSelector)};
 | 
	
		
			
				|  |  |  			methods.push(method);
 | 
	
		
			
				|  |  |  			manip.installMethod(method, rootAsClass);
 | 
	
		
			
				|  |  |  			return method;
 | 
	
		
			
				|  |  |  		};
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -		this.isSelector = function (selector) {
 | 
	
		
			
				|  |  | -			return checker[selector];
 | 
	
		
			
				|  |  | +		this.isSelector = function (jsSelector) {
 | 
	
		
			
				|  |  | +			return checker[jsSelector];
 | 
	
		
			
				|  |  |  		};
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  		/* Dnu handler method */
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -		function createHandler(selector) {
 | 
	
		
			
				|  |  | +		function createHandler(stSelector) {
 | 
	
		
			
				|  |  |  			return function() {
 | 
	
		
			
				|  |  | -				return brikz.messageSend.messageNotUnderstood(this, selector, arguments);
 | 
	
		
			
				|  |  | +				return brikz.messageSend.messageNotUnderstood(this, stSelector, arguments);
 | 
	
		
			
				|  |  |  			};
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -987,43 +987,44 @@ define("amber/boot", [ 'require', './browser-compatibility' ], function (require
 | 
	
		
			
				|  |  |  		/* Handles unhandled errors during message sends */
 | 
	
		
			
				|  |  |  		// simply send the message and handle #dnu:
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -		st.send = function(receiver, selector, args, klass) {
 | 
	
		
			
				|  |  | +		st.send = function(receiver, jsSelector, args, klass) {
 | 
	
		
			
				|  |  |  			var method;
 | 
	
		
			
				|  |  |  			if(receiver === null) {
 | 
	
		
			
				|  |  |  				receiver = nil;
 | 
	
		
			
				|  |  |  			}
 | 
	
		
			
				|  |  | -			method = klass ? klass.fn.prototype[selector] : receiver.klass && receiver[selector];
 | 
	
		
			
				|  |  | +			method = klass ? klass.fn.prototype[jsSelector] : receiver.klass && receiver[jsSelector];
 | 
	
		
			
				|  |  |  			if(method) {
 | 
	
		
			
				|  |  |  				return method.apply(receiver, args);
 | 
	
		
			
				|  |  |  			} else {
 | 
	
		
			
				|  |  | -				return messageNotUnderstood(receiver, selector, args);
 | 
	
		
			
				|  |  | +				return messageNotUnderstood(receiver, st.convertSelector(jsSelector), args);
 | 
	
		
			
				|  |  |  			}
 | 
	
		
			
				|  |  |  		};
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -		/* Handles #dnu: *and* JavaScript method calls.
 | 
	
		
			
				|  |  | -		 if the receiver has no klass, we consider it a JS object (outside of the
 | 
	
		
			
				|  |  | -		 Amber system). Else assume that the receiver understands #doesNotUnderstand: */
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -		function messageNotUnderstood(receiver, selector, args) {
 | 
	
		
			
				|  |  | -			/* Handles JS method calls. */
 | 
	
		
			
				|  |  | -			if(receiver.klass === undefined || receiver.allowJavaScriptCalls) {
 | 
	
		
			
				|  |  | -				return callJavaScriptMethod(receiver, selector, args);
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -			/* Handles not understood messages. Also see the Amber counter-part
 | 
	
		
			
				|  |  | -			 Object>>doesNotUnderstand: */
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +		function invokeDnuMethod(receiver, stSelector, args) {
 | 
	
		
			
				|  |  |  			return receiver._doesNotUnderstand_(
 | 
	
		
			
				|  |  |  				globals.Message._new()
 | 
	
		
			
				|  |  | -					._selector_(st.convertSelector(selector))
 | 
	
		
			
				|  |  | +					._selector_(stSelector)
 | 
	
		
			
				|  |  |  					._arguments_([].slice.call(args))
 | 
	
		
			
				|  |  |  			);
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -		/* Call a method of a JS object, or answer a property if it exists.
 | 
	
		
			
				|  |  | -		 Else try wrapping a JSObjectProxy around the receiver.
 | 
	
		
			
				|  |  | +		/* Handles #dnu: *and* JavaScript method calls.
 | 
	
		
			
				|  |  | +		 if the receiver has no klass, we consider it a JS object (outside of the
 | 
	
		
			
				|  |  | +		 Amber system). Else assume that the receiver understands #doesNotUnderstand: */
 | 
	
		
			
				|  |  | +		function messageNotUnderstood(receiver, stSelector, args) {
 | 
	
		
			
				|  |  | +			if (receiver.klass !== undefined && !receiver.allowJavaScriptCalls) {
 | 
	
		
			
				|  |  | +				return invokeDnuMethod(receiver, stSelector, args);
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +			/* Call a method of a JS object, or answer a property if it exists.
 | 
	
		
			
				|  |  | +			 Else try wrapping a JSObjectProxy around the receiver. */
 | 
	
		
			
				|  |  | +			var propertyName = st.st2prop(stSelector);
 | 
	
		
			
				|  |  | +			if (!(propertyName in receiver)) {
 | 
	
		
			
				|  |  | +				return invokeDnuMethod(globals.JSObjectProxy._on_(receiver), stSelector, args);
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +			return accessJavaScript(receiver, propertyName, args);
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -		 If the object property is a function, then call it, except if it starts with
 | 
	
		
			
				|  |  | +		/* If the object property is a function, then call it, except if it starts with
 | 
	
		
			
				|  |  |  		 an uppercase character (we probably want to answer the function itself in this
 | 
	
		
			
				|  |  |  		 case and send it #new from Amber).
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -1032,24 +1033,19 @@ define("amber/boot", [ 'require', './browser-compatibility' ], function (require
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  		 Example:
 | 
	
		
			
				|  |  |  		 "self do: aBlock with: anObject" -> "self.do(aBlock, anObject)" */
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -		function callJavaScriptMethod(receiver, selector, args) {
 | 
	
		
			
				|  |  | -			var jsSelector = st.st2prop(selector);
 | 
	
		
			
				|  |  | -			if (jsSelector in receiver) {
 | 
	
		
			
				|  |  | -				var jsProperty = receiver[jsSelector];
 | 
	
		
			
				|  |  | -				if (typeof jsProperty === "function" && !/^[A-Z]/.test(jsSelector)) {
 | 
	
		
			
				|  |  | -					return jsProperty.apply(receiver, args);
 | 
	
		
			
				|  |  | -				} else if (args.length > 0) {
 | 
	
		
			
				|  |  | -					receiver[jsSelector] = args[0];
 | 
	
		
			
				|  |  | -					return nil;
 | 
	
		
			
				|  |  | -				} else {
 | 
	
		
			
				|  |  | -					return jsProperty;
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | +		function accessJavaScript(receiver, propertyName, args) {
 | 
	
		
			
				|  |  | +			var propertyValue = receiver[propertyName];
 | 
	
		
			
				|  |  | +			if (typeof propertyValue === "function" && !/^[A-Z]/.test(propertyName)) {
 | 
	
		
			
				|  |  | +				return propertyValue.apply(receiver, args);
 | 
	
		
			
				|  |  | +			} else if (args.length > 0) {
 | 
	
		
			
				|  |  | +				receiver[propertyName] = args[0];
 | 
	
		
			
				|  |  | +				return nil;
 | 
	
		
			
				|  |  | +			} else {
 | 
	
		
			
				|  |  | +				return propertyValue;
 | 
	
		
			
				|  |  |  			}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -			return st.send(globals.JSObjectProxy._on_(receiver), selector, args);
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +		st.accessJavaScript = accessJavaScript;
 | 
	
		
			
				|  |  |  		this.messageNotUnderstood = messageNotUnderstood;
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -1110,7 +1106,6 @@ define("amber/boot", [ 'require', './browser-compatibility' ], function (require
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          st.st2prop = function (stSelector) {
 | 
	
		
			
				|  |  | -            if (stSelector[0] === '_') return ''; // TODO revert when #1062 root cause fixed
 | 
	
		
			
				|  |  |              var colonPosition = stSelector.indexOf(':');
 | 
	
		
			
				|  |  |              return colonPosition === -1 ? stSelector : stSelector.slice(0, colonPosition);
 | 
	
		
			
				|  |  |          };
 |