/**
   * Add EventHandler to handlers list & search through the EventHandlers EventTypes, placing it in
   * the correct lists, so Events can be filtered correctly.
   */
  public final void addEventHandler(final EventHandler _handler) {
    if (exists(_handler) == true) {
      Logger.println(_handler.getName() + "already exists within " + name, Logger.Verbosity.MAJOR);
      return;
    }

    handlers.add(_handler);

    final ArrayList<EventType> types = _handler.getWantedEventTypes();
    if (types.isEmpty() == true || types.contains(Event.ALL_EVENT_TYPES) == true) {
      // Due to legacy we must assumme that a types size of 0,
      // represents a developer wishing to recieve all Events.
      // If the types contains ALL_EVENT_TYPES then only add it
      // to the ALL_EVENT_TYPES EventQueue.
      eventQueues.get(Event.ALL_EVENT_TYPES).addEventHandler(_handler);
      return;
    }

    for (final EventType type : types) {
      if (eventQueues.containsKey(type) == false) {
        addEventQueue(type, new EventQueue(type));
      }

      eventQueues.get(type).addEventHandler(_handler);
    }
  }
  private void remove(final EventHandler _handler) {
    final ArrayList<EventType> types = _handler.getWantedEventTypes();
    if (types.isEmpty() == true) {
      // Due to legacy we must assumme that a types size of 0,
      // represents Event.ALL_EVENT_TYPES, must be specially removed.
      eventQueues.get(Event.ALL_EVENT_TYPES).removeEventHandler(_handler);
    }

    for (final EventType type : types) {
      if (eventQueues.containsKey(type) == true) {
        eventQueues.get(type).removeEventHandler(_handler);
      }
    }

    handlers.remove(_handler);
    _handler.reset(); // Should clear any
  }