package com.project.shared.client.events; import java.util.ArrayList; import com.google.gwt.event.shared.EventHandler; import com.google.gwt.event.shared.HandlerRegistration; import com.project.shared.data.funcs.Func; public class SimpleEvent<T> { public interface Handler<T> extends EventHandler { void onFire(T arg); } ArrayList<Handler<T>> handlers = new ArrayList<Handler<T>>(); public HandlerRegistration addHandler(final Handler<T> handler) { this.handlers.add(handler); return new HandlerRegistration() { public void removeHandler() { handlers.remove(handler); } }; } public void dispatch(T arg) { // Iterate a copy to prevent ConcurrentModificationException for (Handler<T> handler : new ArrayList<Handler<T>>(this.handlers)) { handler.onFire(arg); } } /** * Convenience method for using event firing in an AsyncFunc / Func chain. * @return An action that dispatches (fires) the event. */ public Func.Action<T> getDispatchFunc() { return new Func.Action<T>() { @Override public void exec(T arg) { dispatch(arg); } }; } public void clearAllHandlers() { this.handlers.clear(); } }