public final void trigger(EventListener listener, EventEmitterInterface emitter) throws UnhandledEventException, InvocationTargetException {
		// Event itself is not modified
		Event event = (Event) this.clone();

		// Set the emitter
		event.emitter = emitter;

		// --------------------------------------
		// In memoriam of Generics-powered events
		// --------------------------------------

		// The class of the event
		Class<?> eventClass = event.getClass();

		while(eventClass != null) {
			try {
				// Try to get a handler for the exact class of this event
				Method on = listener.getClass().getMethod("on", eventClass);

				// Ensure accessibility
				on.setAccessible(true); // Inner-class are otherwise unavailable

				// Invoke!
				on.invoke(listener, event);

				// Done
				return;
			}
			catch(InvocationTargetException e) {
				// Invocation throwed an exception, rethrow it
				throw e;
			}
			catch(NoSuchMethodException | IllegalAccessException e) {
				// Exception when gettin / invoking the handler

				if(eventClass == Event.class) {
					// Event is the super-class of all events
					break;
				}

				// Try!
				eventClass = eventClass.getSuperclass();
			}
		}

		// Event has not be catched
		throw new UnhandledEventException();
	}