/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package org.netbeans.modules.javascript2.editor;

import org.netbeans.api.java.classpath.ClassPath;
import org.netbeans.api.java.classpath.GlobalPathRegistry;
import org.netbeans.modules.javascript2.editor.classpath.ClassPathProviderImpl;
import org.openide.modules.ModuleInstall;

/**
 * Unregisters JavaScript boot classpath from GlobalPathRegistry.
 *
 * @author Martin Fousek <marfous@netbeans.org>
 */
public class ModuleInstaller extends ModuleInstall {

    @Override
    public void uninstalled() {
        GlobalPathRegistry.getDefault().unregister(ClassPathProviderImpl.BOOT_CP,
                new ClassPath[]{ClassPathProviderImpl.getBootClassPath()});
    }

}
