package se.rhel.event;
import java.util.ArrayList;
import java.util.HashMap;
/**
* Group: Logic
* Created by Emil on 2014-03-28.
*/
public final class Events {
// Mapping of class events to active listeners
private final HashMap<Class, ArrayList> mMap = new HashMap<Class, ArrayList>(10);
// Add a listener to an event class
public <L> void listen(Class<? extends GameEvent<L>> evtClass, L listener) {
final ArrayList<L> listeners = listenersOf(evtClass);
synchronized (listeners) {
if(!listeners.contains(listener)) {
listeners.add(listener);
}
}
}
// Stop sending an event class to a given listener
public <L> void mute(Class<? extends GameEvent<L>> evtClass, L listener) {
final ArrayList<L> listeners = listenersOf(evtClass);
synchronized (listeners) {
listeners.remove(listener);
}
}
// Gets listeners for a given event class
private <L> ArrayList<L> listenersOf(Class<? extends GameEvent<L>> evtClass) {
synchronized (mMap) {
final ArrayList<L> existing = mMap.get(evtClass);
if(existing != null) {
return existing;
}
final ArrayList<L> emptyList = new ArrayList<L>(5);
mMap.put(evtClass, emptyList);
return emptyList;
}
}
// Notify a new event to registered listeners of this event class
public <L> void notify(final GameEvent<L> event) {
Class<GameEvent<L>> evtClass = (Class<GameEvent<L>>) event.getClass();
for(L listener : listenersOf(evtClass)) {
event.notify(listener);
}
}
}