@Override
    public void disablePlugin(Plugin plugin) {
        Validate.isTrue(plugin instanceof InjectablePlugin, "Plugin is not associated with this PluginLoader");
        
        if (plugin.isEnabled()) {
            String message = String.format("Disabling %s", plugin.getName());
            plugin.getLogger().info(message);
            
            Bukkit.getPluginManager().callEvent(new PluginDisableEvent(plugin));
            
            InjectablePlugin iPlugin = (InjectablePlugin) plugin;
            ClassLoader cLoader = iPlugin.getClass().getClassLoader();
            
            try {
                iPlugin.setEnabled(true);
            } catch (Throwable ex) {
                Injector.getLogger().log(Level.SEVERE, "Error occurred while disabling " + plugin.getName());
            }
            
            loaders.remove(plugin.getName());
            
            if (cLoader instanceof InjectorClassLoader) {
                InjectorClassLoader loader = (InjectorClassLoader) cLoader;
                Set<String> names = loader.getClasses();
                
                for (String name : names) {
                    removeClass(name);
                }
            }
        }
    }