package tc.oc.commons.core.inject;
import com.google.inject.Key;
import com.google.inject.Module;
import com.google.inject.PrivateBinder;
import com.google.inject.TypeLiteral;
import com.google.inject.binder.LinkedBindingBuilder;
import tc.oc.inject.ForwardingBinder;
import tc.oc.inject.ForwardingPrivateBinder;
public interface PrivateBinders extends Binders, ForwardingPrivateBinder {
static PrivateBinders wrap(PrivateBinder binder) {
if(binder instanceof PrivateBinders) {
return (PrivateBinders) binder;
}
final PrivateBinder skipped = binder.skipSources(Binders.class,
PrivateBinders.class,
ForwardingBinder.class,
ForwardingPrivateBinder.class);
return () -> skipped;
}
default <T> LinkedBindingBuilder<T> bindAndExpose(Key<T> key) {
expose(key);
return bind(key);
}
default <T> LinkedBindingBuilder<T> bindAndExpose(TypeLiteral<T> type) {
return bindAndExpose(Key.get(type));
}
default <T> LinkedBindingBuilder<T> bindAndExpose(Class<T> type) {
return bindAndExpose(Key.get(type));
}
/**
* Expose all bindings in the given module.
*/
default void expose(Module module) {
ElementUtils.expose(forwardedBinder(), module);
}
default void installAndExpose(Module module) {
install(module);
expose(module);
}
@Override
default PrivateBinders withSource(Object source) {
return wrap(ForwardingPrivateBinder.super.withSource(source));
}
@Override
default PrivateBinders skipSources(Class... classesToSkip) {
return wrap(ForwardingPrivateBinder.super.skipSources(classesToSkip));
}
}