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 }