// Path: asteroid-core/src/main/java/asteroid/A.java
// @SuppressWarnings("PMD.ShortClassName")
// public final class A {
// 
//     /**
//      * Entry point to get node builders.
//      *
//      * @since 0.1.0
//      */
//     public static final Nodes NODES = new Nodes();
// 
//     /**
//      * Entry point to access language modifiers
//      *
//      * @since 0.1.0
//      */
//     public static final Modifiers ACC = new Modifiers();
// 
//     /**
//      * Entry point to create statements.
//      *
//      * @since 0.1.0
//      */
//     public static final Statements STMT = new Statements();
// 
//     /**
//      * Entry point to create expressions
//      *
//      * @since 0.1.0
//      */
//     public static final Expressions EXPR = new Expressions();
// 
//     /**
//      * Entry point to get util functions
//      *
//      * @since 0.1.0
//      */
//     public static final Utils UTIL = new Utils();
// 
//     /**
//      * Entry point to get criterias
//      *
//      * @since 0.2.4
//      */
//     public static final Criterias CRITERIA = new Criterias();
// }


import asteroid.A;
import org.codehaus.groovy.syntax.Types;
import org.codehaus.groovy.ast.Parameter;
import org.codehaus.groovy.ast.ClassNode;
import org.codehaus.groovy.ast.MethodNode;
import org.codehaus.groovy.ast.stmt.Statement;
package asteroid.nodes;


/**
 * Builder to create instance of type {@link MethodNode}
 *
 * @since 0.1.0
 */
@SuppressWarnings("PMD.AvoidFieldNameMatchingMethodName")
final public class MethodNodeBuilder {

    private final String name;
    private int modifiers;
    private Statement code;
    private ClassNode returnType;
    private Parameter[] parameters = new Parameter[0];
    private ClassNode[] exceptions = new ClassNode[0];

    private MethodNodeBuilder(final String name) {
        this.name = name;
    }

    /**
     * Sets the method name and creates an instance of {@link
     * MethodNodeBuilder}
     *
     * @param name the name of the method
     * @return the current builder instance
     * @since 0.1.0
     */
    public static MethodNodeBuilder method(final String name) {
        return new MethodNodeBuilder(name);
    }

    /**
     * Sets the return type of the method
     *
     * @param returnType a {@link Class} representing the return type
     * of the method
     * @return the current builder instance
     * @since 0.1.0
     */
    public MethodNodeBuilder returnType(final Class returnType) {
// Path: asteroid-core/src/main/java/asteroid/A.java
// @SuppressWarnings("PMD.ShortClassName")
// public final class A {
// 
//     /**
//      * Entry point to get node builders.
//      *
//      * @since 0.1.0
//      */
//     public static final Nodes NODES = new Nodes();
// 
//     /**
//      * Entry point to access language modifiers
//      *
//      * @since 0.1.0
//      */
//     public static final Modifiers ACC = new Modifiers();
// 
//     /**
//      * Entry point to create statements.
//      *
//      * @since 0.1.0
//      */
//     public static final Statements STMT = new Statements();
// 
//     /**
//      * Entry point to create expressions
//      *
//      * @since 0.1.0
//      */
//     public static final Expressions EXPR = new Expressions();
// 
//     /**
//      * Entry point to get util functions
//      *
//      * @since 0.1.0
//      */
//     public static final Utils UTIL = new Utils();
// 
//     /**
//      * Entry point to get criterias
//      *
//      * @since 0.2.4
//      */
//     public static final Criterias CRITERIA = new Criterias();
// }


// Path: asteroid-core/src/main/java/asteroid/nodes/MethodNodeBuilder.java
import asteroid.A;
import org.codehaus.groovy.syntax.Types;
import org.codehaus.groovy.ast.Parameter;
import org.codehaus.groovy.ast.ClassNode;
import org.codehaus.groovy.ast.MethodNode;
import org.codehaus.groovy.ast.stmt.Statement;

package asteroid.nodes;


/**
 * Builder to create instance of type {@link MethodNode}
 *
 * @since 0.1.0
 */
@SuppressWarnings("PMD.AvoidFieldNameMatchingMethodName")
final public class MethodNodeBuilder {

    private final String name;
    private int modifiers;
    private Statement code;
    private ClassNode returnType;
    private Parameter[] parameters = new Parameter[0];
    private ClassNode[] exceptions = new ClassNode[0];

    private MethodNodeBuilder(final String name) {
        this.name = name;
    }

    /**
     * Sets the method name and creates an instance of {@link
     * MethodNodeBuilder}
     *
     * @param name the name of the method
     * @return the current builder instance
     * @since 0.1.0
     */
    public static MethodNodeBuilder method(final String name) {
        return new MethodNodeBuilder(name);
    }

    /**
     * Sets the return type of the method
     *
     * @param returnType a {@link Class} representing the return type
     * of the method
     * @return the current builder instance
     * @since 0.1.0
     */
    public MethodNodeBuilder returnType(final Class returnType) {
        this.returnType = A.NODES.clazz(returnType).build();