/*
 * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
 * and is available at http://www.eclipse.org/legal/epl-v10.html
 */
package org.opendaylight.yangtools.sal.binding.model.api;

import java.util.List;

/**
 * The Method Signature interface contains simplified meta model for java method
 * definition. Each method MUST be defined by name, return type, parameters and
 * access modifier. <br>
 * Additionally method MAY contain associated annotations and comment. By
 * contract if method does not contain any comments or annotation definitions
 * the {@link #getComment()} SHOULD rather return empty string and
 * {@link #getAnnotations()} SHOULD rather return empty list than
 * <code>null</code> values. <br>
 * The defining Type contains the reference to Generated Type that declares
 * Method Signature.
 */
public interface MethodSignature extends TypeMember {

    /**
     * Returns <code>true</code> if the method signature is defined as abstract. <br>
     * By default in java all method declarations in interface are defined as
     * abstract, but the user don't need necessary to declare abstract keyword
     * in front of each method. <br>
     * The abstract methods are allowed in Class definitions but only when the
     * class is declared as abstract.
     * 
     * @return <code>true</code> if the method signature is defined as abstract.
     */
    boolean isAbstract();

    /**
     * Returns the List of parameters that method declare. If the method does
     * not contain any parameters, the method will return empty List.
     * 
     * @return the List of parameters that method declare.
     */
    List<Parameter> getParameters();

    /**
     * The Parameter interface is designed to hold the information of method
     * Parameter(s). The parameter is defined by his Name which MUST be unique
     * as java does not allow multiple parameters with same names for one method
     * and Type that is associated with parameter.
     */
    interface Parameter {

        /**
         * Returns the parameter name.
         * 
         * @return the parameter name.
         */
        String getName();

        /**
         * Returns Type that is bounded to parameter name.
         * 
         * @return Type that is bounded to parameter name.
         */
        Type getType();
    }
}
