class ExtensionPointBuilder {

    private ExtensionPointInternal extensionPointInternal;

    private ExtensionPointBuilder() {

    }

    /**
     * Get extension point
     * @return extension point
     */
    public ExtensionPoint getExtensionPoint() {
        return this.extensionPointInternal;
    }

    /**
     * Create extension point builder
     * @param name extension point name
     * @param beanClassLoader classloader
     * @return extension point builder
     */
    public static ExtensionPointBuilder genericExtensionPoint(String name,
                                                              ClassLoader beanClassLoader) {
        return genericExtensionPoint(name, null, beanClassLoader);
    }

    /**
     * Create extension point builder
     * @param name extension point name
     * @param contributionClass contribution class
     * @param beanClassLoader classloader
     * @return extension point builder
     */
    public static ExtensionPointBuilder genericExtensionPoint(String name,
                                                              Class<?> contributionClass,
                                                              ClassLoader beanClassLoader) {<FILL_FUNCTION_BODY>}

    /**
     * add contribution to extension point
     * @param javaClass contribution class
     */
    public void addContribution(Class<?> javaClass) {
        this.extensionPointInternal.addContribution(javaClass);
    }

    /**
     * add contribution to extension point
     * @param className contribution class name
     */
    public void addContribution(String className) {
        this.extensionPointInternal.addContribution(className);
    }

}

        ExtensionPointBuilder builder = new ExtensionPointBuilder();

        ExtensionPointInternal extensionPoint = new SpringExtensionPointImpl(name,
            contributionClass);
        extensionPoint.setBeanClassLoader(beanClassLoader);

        builder.extensionPointInternal = extensionPoint;
        return builder;
    
<no_super_class>