package sk.stuba.fiit.perconik.core.resources; import java.util.Map; import sk.stuba.fiit.perconik.core.Listener; import sk.stuba.fiit.perconik.core.Resource; import static com.google.common.collect.Maps.newHashMap; abstract class AbstractHookSupport<H extends Hook<T, L>, T, L extends Listener> implements HookFactory<T, L> { private final Map<L, H> hooks; AbstractHookSupport() { this.hooks = newHashMap(); } @SuppressWarnings("unchecked") final void hook(final Resource<? super H> resource, final L listener) { H hook = this.hooks.get(listener); if (hook == null) { // safe cast as internal support always creates correct hooks hook = (H) this.create(listener); this.hooks.put(listener, hook); } DefaultResources.registerTo(resource, hook); } final void unhook(final Resource<? super H> resource, final L listener) { H hook = this.hooks.get(listener); if (hook != null) { DefaultResources.unregisterFrom(resource, hook); } } }