@Override
    public void fireEvent(EventObject event) {

	log.trace("[fireEvent] Firing event {} coming from {}", event.getClass().getSimpleName(), event.getSource()
		.getClass().getSimpleName());

	List<T> listenersToCall = listeners.get(event.getClass());
	Class<?> handlerParam = event.getClass();

	if (listenersToCall == null) {
	    Class<?> superClass = event.getClass().getSuperclass();

	    while (superClass != EventObject.class && superClass != Object.class) {
		listenersToCall = listeners.get(superClass);
		if (listenersToCall != null) {
		    // found a handler for event's super class
		    handlerParam = superClass;
		    break;
		}
		superClass = superClass.getSuperclass();
	    }

	    if (listenersToCall == null) {

		log.debug("[fireEvent] Lost event. No registered listeners for event " + event);

		return;
	    }
	}

	for (T listener : listenersToCall) {
	    int hash = (listener.getClass().hashCode() * 7) ^ (event.getClass().hashCode() * 13);

	    Method callback = getCallback(handlerParam, listener, hash);
	    dispatchEvent(listener, event, callback);
	}

    }