package tc.oc.commons.core.inject;
import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import com.google.inject.Key;
import com.google.inject.Provider;
import com.google.inject.Scope;
import com.google.inject.TypeLiteral;
import com.google.inject.binder.AnnotatedBindingBuilder;
import com.google.inject.binder.LinkedBindingBuilder;
import com.google.inject.binder.ScopedBindingBuilder;
import com.google.inject.internal.Annotations;
import com.google.inject.internal.Scoping;
/**
* Base implementation for the Guice DSL builder class. Possibly useful for custom binders.
*/
public abstract class AbstractBindingBuilder<T> implements AnnotatedBindingBuilder<T> {
protected abstract void applyScoping(Scoping scoping);
@Override
public LinkedBindingBuilder<T> annotatedWith(Class<? extends Annotation> annotationType) {
return annotatedWith(Annotations.generateAnnotation(annotationType));
}
@Override
public ScopedBindingBuilder to(Class<? extends T> implementation) {
return to(Key.get(implementation));
}
@Override
public ScopedBindingBuilder to(TypeLiteral<? extends T> implementation) {
return to(Key.get(implementation));
}
@Override
public ScopedBindingBuilder toProvider(Provider<? extends T> provider) {
return toProvider((javax.inject.Provider<? extends T>) provider);
}
@Override
public ScopedBindingBuilder toProvider(Class<? extends javax.inject.Provider<? extends T>> providerType) {
return toProvider(Key.get(providerType));
}
@Override
public ScopedBindingBuilder toProvider(TypeLiteral<? extends javax.inject.Provider<? extends T>> providerType) {
return toProvider(Key.get(providerType));
}
@Override
public <S extends T> ScopedBindingBuilder toConstructor(Constructor<S> constructor) {
return toConstructor(constructor, TypeLiteral.get(constructor.getDeclaringClass()));
}
@Override
public void in(Class<? extends Annotation> scopeAnnotation) {
applyScoping(Scoping.forAnnotation(scopeAnnotation));
}
@Override
public void in(Scope scope) {
applyScoping(Scoping.forInstance(scope));
}
@Override
public void asEagerSingleton() {
applyScoping(Scoping.EAGER_SINGLETON);
}
}