@Override
    public void stop() {
        final AtomicBoolean hasAnythingChanged = new AtomicBoolean();

        // Create ClassMapper
        final ClassMapper classMapper = this::findRequired;

        // Loop until all nodes have been started.
        Set<DependencyNode> unfinished;
        while (!(unfinished = graph.nodes()
            .filter(n -> n.getCurrentState() != State.STOPPED)
            .collect(toSet())).isEmpty()) {

            hasAnythingChanged.set(false);

            unfinished.forEach(n -> stop(hasAnythingChanged, classMapper, n));

            if (!hasAnythingChanged.get()) {
                throw new IllegalStateException(
                    "Injector appears to be stuck in an infinite loop. The " +
                        "following components have not been stopped: " +
                        unfinished.stream()
                            .map(DependencyNode::getRepresentedType)
                            .map(Class::getSimpleName)
                            .collect(toSet())
                );
            }
        }

        LOGGER_INSTANCE.debug(HORIZONTAL_LINE);
        LOGGER_INSTANCE.debug(
            "| %-79s |",
            "All " + instances.size() + " components have been stopped!"
        );
        LOGGER_INSTANCE.debug(HORIZONTAL_LINE);
    }
Create a new {@link InjectorBuilder} using the default implementation but
with a specific {@code ClassLoader}.

@param classLoader the class loader to use
@return the injector builder
common-parent/injector/src/main/java/com/speedment/common/injector/internal/InjectorImpl.java