package tc.oc.commons.core.inject; import com.google.inject.AbstractModule; import com.google.inject.matcher.Matchers; import com.google.inject.spi.ProvisionListener; /** * Installs necessary stuff to make {@link ContextualProvider}s work. */ public class ContextualProviderModule extends AbstractModule { @Override protected void configure() { bindListener(Matchers.any(), new ProvisionListener() { @Override public <T> void onProvision(ProvisionInvocation<T> provision) { final ProvisionListener.ProvisionInvocation<?> prior = ContextualProvider.provisionInvocation.get(); ContextualProvider.provisionInvocation.set(provision); try { provision.provision(); } finally { if(prior != null) { ContextualProvider.provisionInvocation.set(prior); } else { ContextualProvider.provisionInvocation.remove(); } } } }); } }