private <T> InjectorBuilder withComponentAndSupplier(Class<T> injectableType, Supplier<T> instanceSupplier) {
        requireNonNull(injectableType);

        // This is the only way to inject InjectorProxies via bundles for example
        if (InjectorProxy.class.isAssignableFrom(injectableType)) {
            final InjectorProxy injectorProxy;
            if (instanceSupplier != null) {
                injectorProxy = (InjectorProxy) instanceSupplier.get();
            } else {
                injectorProxy = (InjectorProxy) newInstance(injectableType);
            }
            withInjectorProxy(injectorProxy);
        }

        final Injectable<T> injectable = new Injectable<>(injectableType, instanceSupplier);

        // Append the class itself under its own name
        appendInjectable(injectableType.getName(), injectable, true);

        // Append the class under its InjectKey(s) (if any)
        traverseAncestors(injectableType)
            .filter(c -> c.isAnnotationPresent(InjectKey.class))
            .map(c -> c.getAnnotation(InjectKey.class))
            .forEachOrdered(key -> appendInjectable(key.value().getName(), injectable, key.overwrite()));

        return this;
    }
Default implementation of the {@link InjectorBuilder}-interface.

@author Emil Forslund
@since  1.2.0
common-parent/injector/src/main/java/com/speedment/common/injector/internal/InjectorBuilderImpl.java