@Override
	public void invoke(IEvent event) {
		/*
		 * With the invoke(event) method, we need to not only invoke the Event the EventBus wants, but
		 * every Superclass Event that Event may have. We have to use some Reflection trickery to do this. 
		 */
		//Firstly, synchronize the listenerMap. We don't want an Event to be added while we are trying to add one
		synchronized(this.listenerMap) {
			Class<?> c = event.getClass(); //Get the class of the Event. We will use this later
			Set<EventListener> set = this.listenerMap.keySet(); //Get the set of keys in the listenerMap
			
			//Start looping through the superclasses and the listeners
			while(c != null) {
				//First loop through the EventListener set
				for(EventListener listener : set) {
					//Get the set of the method Pairs to use for Reflection
					TreeSet<UsedPair<Method, EventMethod>> methodSet = this.listenerMap.get(listener);
					
					//Then loop through the TreeSet of Pairs
					for(UsedPair<Method, EventMethod> methodPair : methodSet) {
						//Use some Relfection trickery to get the EventType of the Method
						
						/*
						 * This will get the first input Parameter, which we are going to use to check
						 * against the c variable
						 */
						Class<?> methodEventType = methodPair.getFirst().getParameterTypes()[0];
						
						//Check to see if the MethodType is assignable to the class of c
						if(methodEventType.isAssignableFrom(c)) {
							methodPair.incrementUsedCounter(); //Increment the used counter, since the use was successful
							
							try {
								//Invoke the Event listener
								methodPair.getFirst().invoke(listener, event);
							} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
								/*
								 * If anything should go wrong (which it very much will sooner or later),
								 * print the exception to the logger.
								 */
								this.logger.printException(e);
							}
						}
					}
				}
				c = c.getSuperclass(); //Get the superclass of the event and redo the loop until this is null
			}
		}
	}