protected void addExtension(ExtensionWrapper extension)
      throws NoSuchExtensionException, ExtensionInitializationException,
          ExtensionAlreadyLoadedException, DuplicateExtensionException {
    if (extension == null || extension.getExtension() == null) {
      throw new IllegalArgumentException("Extension cannot be null");
    }
    if (has(extension.getName())) {
      throw new DuplicateExtensionException(extension.getName());
    }
    @SuppressWarnings("unchecked")
    final ProxiedExtensionWrapper wrapper = new ProxiedExtensionWrapper(extension);
    if (extension.getExtension() instanceof PerpetualExtension) {
      wrapper.setOnBeforeUnload(
          new ExtensionWrapperEventCallback() {

            @Override
            public <E> void execute(ExtensionWrapper<E> wrapper) {
              throw new IllegalStateException("Extension cannot be unloaded: " + wrapper.getName());
            }
          });
    }
    console.debug("Extension found: " + extension.getName());
    extensions.put(extension.getName(), wrapper);
    if (extension.getExtension() instanceof AutoLoadedExtension) {
      console.debug("Extension auto-loaded: " + extension.getName());
      load(extension.getName());
    }
  }