void (T listener) { Boolean state = myListenersState.get(listener); if (state == null/*removed*/ || state.booleanValue()) { return; } myListenersState.put(listener, Boolean.TRUE); try { myDispatchingListeners.push(listener); myCurrentDispatchMethod.invoke(listener, myCurrentDispatchArgs); } catch(AbstractMethodError e) { //Do nothing. This listener just does not implement something newly added yet. } catch (InvocationTargetException | IllegalAccessException e) { LOG.error(e.getCause()); } finally { myDispatchingListeners.pop(); } }