# Interface EventManager

All Known Implementing Classes:
  `DefaultEventManager, NoopEventManager`

public interface EventManager
This class acts as bridge between an Object that wants to inform others about its current state or a change thereof (Publisher) and a list of objects interested in the Subject (Listeners).

Since:
  3.1 before 3.1 this was a concrete class.

- ## Method Summary

  Modifier and Type
  Method
  Description
  `void`
  `addListener(Object listener, String methodName, Class<?> eventParameterClass, EventSubject subject)`
  Register an `EventListener` for events sent by any sender.
  `void`
  `addListener(Object listener, String methodName, Class<?> eventParameterClass, EventSubject subject, Object sender)`
  Register an `EventListener` for events sent by a specific sender.
  `void`
  `addNonBlockingListener(Object listener, String methodName, Class<?> eventParameterClass, EventSubject subject)`
  `void`
  `addNonBlockingListener(Object listener, String methodName, Class<?> eventParameterClass, EventSubject subject, Object sender)`
  `boolean`
  `isSingleThreaded()`
  Returns true if this EventManager is single-threaded.
  `void`
  `postEvent(EventObject event, EventSubject subject)`
  Sends an event to all registered objects about a particular subject.
  `void`
  `postNonBlockingEvent(EventObject event, EventSubject subject)`
  Sends an event to all registered objects about a particular subject.
  `boolean`
  `removeAllListeners(EventSubject subject)`
  Removes all listeners for a given subject.
  `boolean`
  `removeListener(Object listener)`
  Unregister the specified listener from all event subjects handled by this manager instance.
  `boolean`
  `removeListener(Object listener, EventSubject subject)`
  Unregister the specified listener for the events about the given subject.
  `boolean`
  `removeListener(Object listener, EventSubject subject, Object sender)`
  Unregister the specified listener for the events about the given subject and the given sender.

- ## Method Details

  - ### isSingleThreaded

    boolean isSingleThreaded()
    Returns true if this EventManager is single-threaded. If so it will throw an exception on any attempt to register an unblocking listener or dispatch a non-blocking event.
    Since:
      1.2

  - ### addListener

    void addListener(Object listener, String methodName, Class<?> eventParameterClass, EventSubject subject)
    Register an `EventListener` for events sent by any sender.
    Throws:
      `RuntimeException` - if `methodName` is not found.

  - ### addNonBlockingListener

    void addNonBlockingListener(Object listener, String methodName, Class<?> eventParameterClass, EventSubject subject)

  - ### addListener

    void addListener(Object listener, String methodName, Class<?> eventParameterClass, EventSubject subject, Object sender)
    Register an `EventListener` for events sent by a specific sender.
    Parameters:
      `listener` - the object to be notified about events
      `methodName` - the name of the listener method to be invoked
      `eventParameterClass` - the class of the single event argument passed to `methodName`
      `subject` - the event subject that the listener is interested in
      `sender` - the object whose events the listener is interested in; `null` means 'any sender'.
    Throws:
      `RuntimeException` - if `methodName` is not found

  - ### addNonBlockingListener

    void addNonBlockingListener(Object listener, String methodName, Class<?> eventParameterClass, EventSubject subject, Object sender)

  - ### removeListener

    boolean removeListener(Object listener)
    Unregister the specified listener from all event subjects handled by this manager instance.
    Parameters:
      `listener` - the object to be unregistered
    Returns:
      `true` if `listener` could be removed for any existing subjects, else returns `false`.

  - ### removeAllListeners

    boolean removeAllListeners(EventSubject subject)
    Removes all listeners for a given subject.

  - ### removeListener

    boolean removeListener(Object listener, EventSubject subject)
    Unregister the specified listener for the events about the given subject.
    Parameters:
      `listener` - the object to be unregistered
      `subject` - the subject from which the listener is to be unregistered
    Returns:
      `true` if `listener` could be removed for the given subject, else returns `false`.

  - ### removeListener

    boolean removeListener(Object listener, EventSubject subject, Object sender)
    Unregister the specified listener for the events about the given subject and the given sender.
    Parameters:
      `listener` - the object to be unregistered
      `subject` - the subject from which the listener is to be unregistered
      `sender` - the object whose events the listener was interested in; `null` means 'any sender'.
    Returns:
      `true` if `listener` could be removed for the given subject, else returns `false`.

  - ### postEvent

    void postEvent(EventObject event, EventSubject subject)
    Sends an event to all registered objects about a particular subject. Event is sent synchronously, so the sender thread is blocked until all the listeners finish processing the event.
    Parameters:
      `event` - the event to be posted to the observers
      `subject` - the subject about which observers will be notified
    Throws:
      `IllegalArgumentException` - if event or subject are null

  - ### postNonBlockingEvent

    void postNonBlockingEvent(EventObject event, EventSubject subject)
    Sends an event to all registered objects about a particular subject. Event is queued by EventManager, releasing the sender thread, and is later dispatched in a separate thread.
    Parameters:
      `event` - the event to be posted to the observers
      `subject` - the subject about which observers will be notified
    Throws:
      `IllegalArgumentException` - if event or subject are null
    Since:
      1.1