class DefaultPluginManager implements PluginManager {

    @Override
    public Collection<Object> loadPlugins(PluginSource source) throws Exception {
        final Collection<Class<?>> pluginClasses = Objects.requireNonNull(source, "Plugin Source cannot be null").load();
        final Collection<Object> loaded = new ArrayList<>();

        if (pluginClasses.isEmpty()) {
            return loaded;
        }

        final Iterator<Class<?>> itr = pluginClasses.iterator();
        while (itr.hasNext()) {
            Class<?> pluginClass = itr.next();
            if (pluginClass.getAnnotation(Plugin.class) == null) {
                itr.remove();
                continue;
            }
            if (context.hasPlugin(pluginClass)) {
                itr.remove();
            }
        }

        Collection<Node<?>> nodes = dependencyResolver.resolve(pluginClasses);
        createPlugins(nodes, loaded);
        return loaded;
    }

    public  DefaultPluginManager(PluginContext context, AnnotationProcessor annotationProcessor, DependencyResolver dependencyResolver);

}