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 }