1 module poison.core.eventobserver; 2 3 import poison.core.eventhandler; 4 import poison.core.eventargs; 5 6 /// An observer for events. 7 class EventObserver { 8 private: 9 /// Global event handlers. 10 static IBaseEventHandler[][string] _globalEventHandlers; 11 12 /// Event handlers. 13 IBaseEventHandler[][string] _eventHandlers; 14 15 public: 16 /** 17 * Subscribes an event handler to an event. 18 * Params: 19 * eventName = The event to subscribe to. 20 * handler = The event handler. 21 */ 22 void subscribe(TEventArgs : EventArgs)(string eventName, EventHandler!TEventArgs handler) { 23 _eventHandlers[eventName] ~= handler; 24 } 25 26 /** 27 * Unsubscribes an event. 28 * Params: 29 * eventName = The name of the event to unsubscribe. 30 */ 31 void unsubscribe(string eventName) { 32 assert(eventName in _eventHandlers); 33 34 _eventHandlers.remove(eventName); 35 } 36 37 /** 38 * Fires an event. 39 * Params: 40 * eventName = The name of the event to fire. 41 * eventArgs = The event args to pass. 42 */ 43 void fireEvent(TEventArgs : EventArgs)(string eventName, TEventArgs eventArgs) { 44 auto handlers = _eventHandlers.get(eventName, null); 45 46 if (handlers) { 47 foreach (handler; handlers) { 48 (cast(EventHandler!TEventArgs)handler)(eventArgs); 49 } 50 } 51 } 52 53 static: 54 /** 55 * Subscribes a global event handler to an event. 56 * Params: 57 * eventName = The event to subscribe to. 58 * handler = The event handler. 59 */ 60 void subscribeGlobal(TEventArgs : EventArgs)(string eventName, EventHandler!TEventArgs handler) { 61 _globalEventHandlers[eventName] ~= handler; 62 } 63 64 /** 65 * Unsubscribes a global event. 66 * Params: 67 * eventName = The name of the event to unsubscribe. 68 */ 69 void unsubscribeGlobal(string eventName) { 70 assert(eventName in _globalEventHandlers); 71 72 _globalEventHandlers.remove(eventName); 73 } 74 75 /** 76 * Fires a global event. 77 * Params: 78 * eventName = The name of the event to fire. 79 * eventArgs = The event args to pass. 80 */ 81 void fireEventGlobal(TEventArgs : EventArgs)(string eventName, TEventArgs eventArgs) { 82 auto handlers = _globalEventHandlers.get(eventName, null); 83 84 if (handlers) { 85 foreach (handler; handlers) { 86 (cast(EventHandler!TEventArgs)handler)(eventArgs); 87 } 88 } 89 } 90 }