1  
     8  
     9  import com.sekati.core.CoreObject;
    10  import com.sekati.log.Logger;
    11  import com.sekati.events.IBroadcastable;
    12  
    13  
    24  class com.sekati.events.Broadcaster extends CoreObject implements IBroadcastable {
    25  
    26  	private static var _instance:Broadcaster;
    27  	private var _listeners:Array;
    28  
    29  	
    32  	private function Broadcaster() {
    33  		super( );
    34  		_listeners = new Array( );
    35  	}
    36  
    37  	
    41  	public static function getInstance():Broadcaster {
    42  		if (!_instance) _instance = new Broadcaster( );
    43  		return _instance;
    44  	}
    45  
    46  	
    49  	public static function get $():Broadcaster {
    50  		return Broadcaster.getInstance( );	
    51  	}	
    52  
    53  	
    62  	public function subscribe(o:Object):Void {
    63  		if (o instanceof Array) {
    64  			for (var i:Number = 0; i < o.length ; i++) {
    65  				addListener( o[i] );
    66  				if (typeof (o[i]) == "movieclip") {
    67  					o[i].onUnload = function ():Void {
    68  						removeListener( o[i] );
    69  					};
    70  				}
    71  			}
    72  		} else {
    73  			addListener( o );
    74  		}
    75  	}
    76  
    77  	
    85  	public function unsubscribe(o:Object):Void {
    86  		if (o instanceof Array) {
    87  			for (var i:Number = 0; i < o.length ; i++) {
    88  				removeListener( o[i] );
    89  			}
    90  		} else {
    91  			removeListener( o );
    92  		}
    93  	}
    94  
    95  	
    99  	public function reset():Void {
   100  		_listeners = new Array( );
   101  	}
   102  
   103  	
   108  	public function broadcast():Void {
   109  		var e:String = String( arguments.shift( ) );
   110  		var a:Array = this._listeners.concat( );
   111  		var l:Number = a.length;
   112  		var m:String = "@@@ Broadcast: \"" + e + "\"";
   113  		Logger.$.notice( _instance, m );
   114  		for (var i:Number = 0; i < l ; i++) {
   115  			a[i][e].apply( a[i], arguments );
   116  		}
   117  	}
   118  
   119  	
   124  	public function addListener(o:Object):Number {
   125  		this.removeListener( o );
   126  		return this._listeners.push( o );
   127  	}
   128  
   129  	
   134  	public function removeListener(o:Object):Boolean {
   135  		var a:Array = this._listeners;
   136  		var i:Number = a.length;
   137  		while (i--) {
   138  			if (a[i] == o) {
   139  				a.splice( i, 1 );
   140  				return true;
   141  			}
   142  		}
   143  		return false;
   144  	}
   145  
   146  	
   150  	public function destroy():Void {
   151  		delete _listeners;
   152  		delete _instance;
   153  		super.destroy( );
   154  	}	
   155  }