public void onEvent(Object event) { Set<Object> delivered = new HashSet<Object>(); for (EventListener listener : this.listeners) { Object target = listener; if (listener instanceof SingleArgumentMethodEventListener) { SingleArgumentMethodEventListener singleArgListener = (SingleArgumentMethodEventListener) listener; target = singleArgListener.getTarget(); } if (listener.accepts(event) && !delivered.contains(target)) { try { listener.onEvent(event); } catch (Throwable t) { log.warn(EVENT_LISTENER_ERROR_MSG, t); } delivered.add(target); } } } }