package tc.oc.commons.core.inject;
import java.util.Arrays;
import java.util.Set;
import javax.inject.Inject;
import com.google.common.collect.Iterables;
import com.google.inject.Injector;
import com.google.inject.Module;
/**
* Creates child {@link Injector}s configured by a {@link ChildConfigurator}s
* of the same type {@link T}.
*
* The default parent injector is whatever Guice passes to the @Inject constructor.
* If you care what that is, be sure to bind this factory explicitly in the injector
* that you want as the parent. If you let it be a JIT binding, the parent injector
* can be unpredictable.
*/
public class ChildInjectorFactory<T> {
private final Injector parent;
private final Set<ChildModule<T>> modules;
@Inject private ChildInjectorFactory(Injector parent, Set<ChildModule<T>> modules) {
this.parent = parent;
this.modules = modules;
}
public Injector createChildInjector(Module... modules) {
return createChildInjector(parent, modules);
}
public Injector createChildInjector(Iterable<? extends Module> modules) {
return createChildInjector(parent, modules);
}
public Injector createChildInjector(Injector parent, Module... modules) {
return createChildInjector(parent, Arrays.asList(modules));
}
public Injector createChildInjector(Injector parent, Iterable<? extends Module> modules) {
return parent.createChildInjector(Iterables.concat(this.modules, modules));
}
}