1  
    10  
    11  import com.sekati.core.CoreObject;
    12  import com.sekati.core.KeyFactory;
    13  import com.sekati.events.IEventBroadcastable;
    14  import com.sekati.except.Catcher;
    15  import com.sekati.except.IllegalOperationException;
    16  import com.sekati.validate.TypeValidation;
    17  
    18  
    21  class com.sekati.events.EventBroadcaster extends CoreObject implements IEventBroadcastable {
    22  
    23  	private static var _instance:EventBroadcaster;
    24  	private var _listeners:Array;
    25  
    26  	
    30  	private function EventBroadcaster() {
    31  		super( );
    32  		_listeners = new Array( );
    33  	}
    34  
    35  	
    39  	public static function getInstance():EventBroadcaster {
    40  		if (!_instance) _instance = new EventBroadcaster( );
    41  		return _instance;
    42  	}
    43  
    44  	
    48  	public static function get $():EventBroadcaster {
    49  		return EventBroadcaster.getInstance( );	
    50  	}
    51  
    52  	
    59  	public function addEventListener(o:Object, event:String, handler:Function):Void {
    60  		var index:Object = getIndex( o );
    61  		if( !_listeners[index] ) _listeners[index] = new Array( );
    62  		if( !_listeners[index][event] ) _listeners[index][event] = new Array( );
    63  		_listeners[index][event].push( handler );
    64  	}
    65  
    66  	
    73  	public function removeEventListener(o:Object, event:String, handler:Function):Void {
    74  		var index:Object = getIndex( o );
    75  		var e:Array = _listeners[index][event];
    76  		for(var i in e) {
    77  			if(e[i] === handler) delete _listeners[index][event][i];
    78  		}
    79  	}
    80  
    81  	
    85  	public function reset():Void {
    86  		_listeners = new Array( );
    87  	}
    88  
    89  	
    94  	public function removeAllFromBroadcaster(o:Object):Void {
    95  		var index:Object = getIndex( o );
    96  		delete _listeners[index];
    97  	}
    98  
    99  	
   105  	public function removeAllFromBroadcasterAndEvent(o:Object, event:String):Void {
   106  		var index:Object = getIndex( o );
   107  		delete _listeners[index][event];
   108  	}
   109  
   110  	
   116  	public function broadcastEvent(o:Object, event:String):Void {
   117  		broadcastArrayArgs( o, event, arguments.slice( 2 ) );
   118  	}
   119  
   120  	
   127  	public function broadcastArrayArgs(o:Object, event:String, args:Array):Void {
   128  		var index:Object = getIndex( o );
   129  		var e:Array = _listeners[index][event];
   130  		for(var i in e) e[i].getFunction( ).apply( this, args );
   131  	}
   132  
   133  	
   140  	private function getIndex(o:Object):Object {
   141  		try {
   142  			if (TypeValidation.isString( o ) || TypeValidation.isNumber( o )) {
   143  				return String( o );
   144  			} else if (TypeValidation.isObject( o ) || TypeValidation.isMovieClip( o ) || TypeValidation.isFunction( o )) {
   145  				return KeyFactory.getKey( o );
   146  			} else {
   147  				throw new IllegalOperationException( this, "Unsupported broadcaster type (must be object, clip, function, string or number).", arguments );
   148  			}
   149  		} catch (e:IllegalOperationException) {
   150  			Catcher.handle( e );
   151  		}
   152  	}
   153  }