blob: eaa133bef7a0b6535af0a1de2af01c0a73a49577 [file] [log] [blame] [raw]
package net.glowstone.shiny.event;
import org.spongepowered.api.event.*;
import java.lang.reflect.Method;
import java.util.*;
/**
* Implementation of {@link EventManager}.
*/
public class ShinyEventManager implements EventManager {
private final Map<Order, List<EventRegistration>> registrations = new EnumMap<>(Order.class);
public ShinyEventManager() {
for (Order order : Order.values()) {
registrations.put(order, new LinkedList<EventRegistration>());
}
}
@Override
public void register(Object obj) {
for (Method method : obj.getClass().getMethods()) {
Subscribe annotation = method.getAnnotation(Subscribe.class);
if (annotation != null && method.getParameterTypes().length == 1) {
EventRegistration reg = new EventRegistration(obj, method, annotation.ignoreCancelled());
registrations.get(annotation.order()).add(reg);
}
}
}
@Override
public void unregister(Object obj) {
for (List<EventRegistration> list : registrations.values()) {
Iterator<EventRegistration> iter = list.iterator();
while (iter.hasNext()) {
if (iter.next().getObject() == obj) {
iter.remove();
}
}
}
}
@Override
public boolean call(Event event) {
for (List<EventRegistration> list : registrations.values()) {
for (EventRegistration reg : list) {
reg.call(event);
}
}
return !(event instanceof Cancellable) || ((Cancellable) event).isCancelled();
}
public void callSpecial(Object target, Event event) {
for (List<EventRegistration> list : registrations.values()) {
for (EventRegistration reg : list) {
if (reg.getObject() == target) {
reg.call(event);
}
}
}
}
}