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()); } }