Event.Listener = Class.create(); 
Object.extend( 
	Event.Listener, { 
		_listens: new Array(), 
		getEventHandlerName: function( event_name ) { 
			var onEvent_name = event_name.split( /[ _]/ ).join( '-' ).camelize(); 
			return "on" + onEvent_name.charAt( 0 ).toUpperCase() + onEvent_name.substr( 1 ); 
		},
		listenForEvent: function( event_source, event_name, use_capture, onEvent_name ) { 
			if ( ! onEvent_name ) onEvent_name = this.getEventHandlerName( event_name ); 
			var cb = this[ onEvent_name ].bindAsEventListener( this ); 
			this._listens.push( [ event_source, event_name, use_capture, onEvent_name, cb ] ) 
			event_source.addEventListener( event_name, cb, use_capture ); 
		}, 
		stopListeningForEvent: function( event_source, event_name, use_capture, onEvent_name ) { 
			if ( ! onEvent_name ) onEvent_name = this.getEventHandlerName( event_name ); 
			var ix_item; 
			var ls = this._listens.detect( 
				function( val, ix ) { 
					if ( ( val[ 0 ] == event_source ) && ( val[ 1 ] == event_name ) && ( val[ 2 ] == use_capture ) && ( val[ 3 ] == onEvent_name ) ) { 
						ix_item = ix; return true; 
					} 
				} ); 
			if ( ix_item ) { 
				this._listens.splice( ix_item, 1 ); 
				event_source.removeEventListener( event_name, ls[ 4 ], use_capture ); 
				return true; 
			} 
			return false; 
		} 
	} );