
/*	Custom method listener	*/
		Object.extend( Event, {
			AFTER : 'after', 
			AROUND : 'around', 
			BEFORE : 'before', 
			observeMethod : function( scope, method, callback, aspect ) {
				scope.listeners = $H( scope.listeners || {} );
				if ( !scope.listeners[method] ) {
					scope.listeners[method] = this.setAspects();
					var __method = scope[method];
					scope[method] = function() {
						Event.dispatchCustomEvent( scope, scope.listeners[method].before, arguments );
						Event.dispatchCustomEvent( scope, scope.listeners[method].around, arguments );
						var args = $A( arguments );
						var r =  __method.apply( scope, arguments );
						args.push( r );
						Event.dispatchCustomEvent( scope, scope.listeners[method].around, args );
						Event.dispatchCustomEvent( scope, scope.listeners[method].after, args );
						return r;
					}.bind( scope );
				}
				aspect = aspect || this.AFTER;
				if ( scope.listeners[method][aspect].indexOf( callback ) < 0 )
					scope.listeners[method][aspect].push( callback );
			}, 
			purgeMethodListeners : function( scope ) {
				if ( arguments.length > 0 ) {
					if ( arguments.length > 1 ) 
						scope.listeners[arguments[1]][arguments[2]] = [];
					else 
						scope.listeners[arguments[1]] = this.setAspects();
				}
				else 
					scope.listeners.each( function( listener ) { 
						listener = this.setAspects();
					}.bind( this ) );
			}, 
			stopObserveMethod : function( scope, method, callback, aspect ) {
				aspect = aspect || this.AFTER;
				scope.listeners[method][aspect] = scope.listeners[method][aspect].without( callback );
			}, 
			dispatchCustomEvent : function( scope, events, argv ) {
				var args = argv;
				if ( events instanceof Array )
					events.each( function( func ) {
						func.apply( this, args );
					}.bind( scope ) );
				else events.apply( scope, args );
			}, 
			setAspects : function() {
				return { after : [], around : [], before : [] };
			}
		} );