protected final void raiseEvent(Event event) {
		if (event == null)
			return;
		
		Class<?> eventClass = event.getClass();

		while (Event.class.isAssignableFrom(eventClass)) {
			fireEvent(eventClass, event);
			
			Class<?>[] interfaces = eventClass.getInterfaces();
			for (Class<?> i : interfaces) {
				if (Event.class.isAssignableFrom(i)) {
					fireEvent(i, event);
				}
			}
			
			eventClass = eventClass.getSuperclass();
		}
	}