@SuppressWarnings("unchecked")
  @Override
  public void dispatchEvent(@Nonnull Event<?> event) {
    AutowireCapableBeanFactory factory = applicationContext.getAutowireCapableBeanFactory();
    List<Event<?>> queue = Lists.<Event<?>>newArrayList(event);

    while (!queue.isEmpty()) {
      Event<?> evt = queue.remove(0);

      for (Class<? extends EventHandler<?>> eventHandler :
          handlers.get((Class<? extends Event<?>>) evt.getClass())) {
        EventHandler<Event<?>> handler =
            (EventHandler<Event<?>>)
                factory.autowire(eventHandler, AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, true);

        EventResult result = handler.onEvent(evt);

        if (result.isAbort()) {
          throw new RuntimeException(
              String.format(
                  "Handler %s aborted event %s with message: %s",
                  handler, evt, result.getMessage()));
        }

        queue.addAll(result.getTriggeredEvents());
      }
    }
  }