package tc.oc.commons.core.inject; import tc.oc.inject.ForwardingBinder; import tc.oc.inject.ForwardingPrivateBinder; import tc.oc.inject.ForwardingProtectedBinder; import tc.oc.inject.ProtectedBinder; public interface ProtectedBinders extends PrivateBinders, ForwardingProtectedBinder { static ProtectedBinders wrap(ProtectedBinder binder) { if(binder instanceof ProtectedBinders) { return (ProtectedBinders) binder; } final ProtectedBinder skipped = binder.skipSources(Binders.class, PrivateBinders.class, ProtectedBinders.class, ForwardingBinder.class, ForwardingPrivateBinder.class, ForwardingProtectedBinder.class); return () -> skipped; } @Override default Binders publicBinder() { return Binders.wrap(ForwardingProtectedBinder.super.publicBinder()); } @Override default ProtectedBinders withSource(Object source) { return wrap(ForwardingProtectedBinder.super.withSource(source)); } @Override default ProtectedBinders skipSources(Class[] classesToSkip) { return wrap(ForwardingProtectedBinder.super.skipSources(classesToSkip)); } }