@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()); } } }