module poison.core.eventhandler;

import poison.core.eventargs;

/// A base event handler.
interface IBaseEventHandler { }

/// An event handler.
class EventHandler(TEventArgs : EventArgs) : IBaseEventHandler {
  private:
  /// The function pointer of the event handler.
  void function(TEventArgs) _f;

  /// The delegate of the event handler.
  void delegate(TEventArgs) _d;

  public:
  /**
  * Creates a new event handler.
  * Params:
  *   f = The function pointer.
  */
  this(void function(TEventArgs) f) {
    _f = f;
  }

  /**
  * Creates a new event handler.
  * Params:
  *   d = The delegate.
  */
  this(void delegate(TEventArgs) d) {
    _d = d;
  }

  /**
  * Operator overload for calling the event handler implicit.
  * Params:
  *   e = The event args.
  */
  void opCall(TEventArgs e) {
    if (_f) {
      _f(e);
    }
    else if (_d) {
      _d(e);
    }
  }
}