@Override
  public <ET extends Event> void push(ET event) {
    List<Subscriber<ET>> subscribers;

    synchronized (registeredSubscribers) {
      if (!registeredSubscribers.containsKey(event.getClass())) return;

      // Inspection disabled because all inserts in to registeredSubscribers are type insured
      // due to type erasure, we can not have per-pair types.
      // noinspection unchecked
      subscribers =
          (List<Subscriber<ET>>) new ArrayList(registeredSubscribers.get(event.getClass()));
    }

    for (Subscriber<ET> subscriber : subscribers) {
      boolean txDeterminate = true;
      for (ListenerFilter filter : subscriber.getFilters()) {
        // This can only occur if someone f***s something up in an annotation, as listeners should
        // be typesafe when passed to subscribers
        // noinspection unchecked
        txDeterminate = txDeterminate && filter.shouldSend(event);
      }

      if (txDeterminate) subscriber.eventReceived(event);
    }
  }