package proton.inject; import java.lang.annotation.Annotation; import proton.inject.binding.BindingBuilder; import proton.inject.binding.BindingBuilderImpl; import proton.inject.binding.Bindings; import proton.inject.listener.FieldListener; import proton.inject.listener.FieldListeners; import proton.inject.listener.ProviderListener; import proton.inject.listener.ProviderListeners; import static proton.inject.util.Validator.checkNotNull; import static proton.inject.util.Validator.checkState; public abstract class AbstractModule implements Module { private Bindings mBindings; private ProviderListeners mProviderListeners; private FieldListeners mFieldListeners; @Override public final synchronized void configure(Bindings bindings, ProviderListeners providerListeners, FieldListeners fieldListeners) { checkState(mBindings == null, "Re-entry is not allowed."); mBindings = checkNotNull(bindings, "bindings"); mProviderListeners = checkNotNull(providerListeners, "providerListeners"); mFieldListeners = checkNotNull(fieldListeners, "fieldListeners"); try { configure(); } finally { mProviderListeners = null; mBindings = null; } } abstract protected void configure(); protected <T> BindingBuilder<T> bind(Class<T> clazz) { checkState(mBindings != null, "The Bindings can only be used inside configure()"); return new BindingBuilderImpl<T>(clazz, mBindings); } protected void bindProviderListener(ProviderListener providerListener) { mProviderListeners.register(providerListener); } protected void bindFieldListener(Class<? extends Annotation> annClass, FieldListener fieldListener) { mFieldListeners.register(annClass, fieldListener); } }