package org.robotninjas.barge.state; import com.google.inject.AbstractModule; import com.google.inject.binder.LinkedBindingBuilder; import com.google.inject.multibindings.Multibinder; /** * A container for making it possible to bind multiple instance of {@link org.robotninjas.barge.state.StateTransitionListener}. * * <p>This class uses Guice's {@link Multibinder} extension to make it possible to inject a collection of listeners * into the context. It is intended to be extended by Raft applicative level code to customize what implementations * of listeners are implemented:</p> * <pre> * public class MyListenersModule extends ListenersModule { * * } * </pre> * * @see <a href="https://code.google.com/p/google-guice/wiki/Multibindings">Guice Multibindings</a> on their wiki * * @see <a href="http://stackoverflow.com/questions/4410712/injecting-collection-of-classes-with-guice">Stack overflow</a> * question on the subject, along with another possible answer. */ public abstract class AbstractListenersModule extends AbstractModule { private Multibinder<StateTransitionListener> listenerBinder; private Multibinder<RaftProtocolListener> protocolListenerBinder; @Override protected void configure() { listenerBinder = Multibinder.newSetBinder(binder(), StateTransitionListener.class); protocolListenerBinder = Multibinder.newSetBinder(binder(), RaftProtocolListener.class); configureListeners(); } protected abstract void configureListeners(); protected final LinkedBindingBuilder<StateTransitionListener> bindTransitionListener() { return listenerBinder.addBinding(); } protected final LinkedBindingBuilder<RaftProtocolListener> bindProtocolListener() { return protocolListenerBinder.addBinding(); } }