private final Map<Class<? extends Event>, List<EventMethod>> eventMap = Maps.newHashMap();
public void addListener(final Object eventListener) {
for (final Method method : eventListener.getClass().getDeclaredMethods()) {
if (method.isAnnotationPresent(EventHandler.class) && method.getParameterTypes().length == 1) {
if (!method.isAccessible()) { method.setAccessible(true); }
final Class<? extends Event> eventClass = (Class<? extends Event>) method.getParameterTypes()[0];
final List<EventMethod> eventMethods = eventMap.getOrDefault(eventClass, new ArrayList<>());
eventMethods.add(new EventMethod(eventListener, method));
eventMap.put(eventClass, eventMethods);
}
}
}
public void removeListener(final Object object) {
final HashMap<Class<? extends Event>, List<EventMethod>> toRemove = new HashMap<>();
for (final Entry<Class<? extends Event>, List<EventMethod>> entry : eventMap.entrySet()) {
List<EventMethod> remove = new ArrayList<>();
for (EventMethod eventMethod : entry.getValue())
if (eventMethod.getEventListener() == object) { remove.add(eventMethod); }
entry.getValue().removeAll(remove);
remove.clear();
}
}
public Event fireEvent(final Event event) {
if (event == null) { return null; }
final List<EventMethod> eventMethods = eventMap.getOrDefault(event.getClass(), null);
if (eventMethods == null) { return event; }
eventMethods.forEach(eventMethod ->
{
try {
eventMethod.getMethod().invoke(eventMethod.getEventListener(), event);
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
});
return event;
}