@Override
 public void load(String name)
     throws ExtensionInitializationException, NoSuchExtensionException,
         ExtensionAlreadyLoadedException {
   if (isLoaded(name)) {
     throw new ExtensionAlreadyLoadedException(name);
   }
   get(name).load();
   loaded.add(name);
 }
 @Override
 public void execute(String command)
     throws InvalidCommandException, AmbiguousCommandException, ConsoleCommandExecutionException {
   command = command.trim();
   String target = "";
   if (command.matches("\\S+:.*")) {
     target = command.substring(0, command.indexOf(":"));
     command = command.substring(command.indexOf(":") + 1).trim();
     for (ProxiedExtensionWrapper wrapper : extensions.values()) {
       if (wrapper.getNamespace().equals(target)) {
         wrapper.execute(command);
         target = "";
         break;
       }
     }
     if (!target.isEmpty()) {
       throw new IllegalStateException("No such namespace: " + target);
     }
     return;
   }
   final Set<ExtensionWrapper> namespaces = new HashSet<ExtensionWrapper>();
   for (String name : loaded) {
     ProxiedExtensionWrapper wrapper = extensions.get(name);
     if (wrapper.knows(command)) {
       namespaces.add(wrapper);
     }
   }
   if (namespaces.isEmpty()) {
     throw new InvalidCommandException("Invalid command: " + command);
   }
   if (namespaces.size() == 1) {
     final ExtensionWrapper wrapper = namespaces.iterator().next();
     wrapper.execute(command);
     return;
   }
   final String[] strings = new String[namespaces.size()];
   int i = 0;
   for (ExtensionWrapper namespace : namespaces) {
     strings[i++] = namespace.getNamespace();
   }
   throw new AmbiguousCommandException(command, strings);
 }
 @Override
 public void unload(String name) throws ExtensionUnloadingException, NoSuchExtensionException {
   get(name).unload();
   loaded.remove(name);
 }
 @Override
 public boolean isLoaded(String name) {
   return loaded.contains(name);
 }