// Path: xm-lep-api/src/main/java/com/icthh/xm/lep/api/LepMethod.java
// public interface LepMethod {
// 
//     Object getTarget();
// 
//     MethodSignature getMethodSignature();
// 
//     Object[] getMethodArgValues();
// 
// }
// 
// Path: xm-lep-api/src/main/java/com/icthh/xm/lep/api/MethodSignature.java
// public interface MethodSignature {
// 
//     /**
//      * Returns the identifier part of this signature.  For methods this
//      * will return the method name.
//      *
//      * @return the identifier part of this signature
//      * @see java.lang.reflect.Member#getName
//      */
//     String getName();
// 
//     /**
//      * Returns the modifiers on this signature represented as an int.  Use
//      * the constants and helper methods defined on {@code java.lang.reflect.Modifier} to manipulate this, i.e.
//      * <pre>
//      *     // check if this signature is public
//      *     java.lang.reflect.Modifier.isPublic(sig.getModifiers());
//      *
//      *     // print out the modifiers
//      *     java.lang.reflect.Modifier.toString(sig.getModifiers());
//      * </pre>
//      *
//      * @return the modifiers on this signature represented as an int
//      * @see java.lang.reflect.Member#getModifiers
//      * @see java.lang.reflect.Modifier
//      */
//     int getModifiers();
// 
//     /**
//      * <p>Returns a {@code java.lang.Class} object representing the class,
//      * interface, or aspect (proxy) that declared this member.  For intra-member
//      * declarations, this will be the type on which the member is declared,
//      * not the type where the declaration is lexically written.  Use
//      * {@code SourceLocation.getWithinType()} to get the type in
//      * which the declaration occurs lexically.</p>
//      * <p>For consistency with {@code java.lang.reflect.Member}, this
//      * method named {@code getDeclaringClass()}.</p>
//      *
//      * @return a {@code java.lang.Class} object representing the class, interface,
//      *     or aspect (proxy) that declared this member
//      * @see java.lang.reflect.Member#getDeclaringClass
//      */
//     Class<?> getDeclaringClass();
// 
//     /**
//      * Returns the fully-qualified name of the declaring type. This is
//      * equivalent to calling getDeclaringClass().getName(), but caches
//      * the result for greater efficiency.
//      *
//      * @return the fully-qualified name of the declaring type
//      */
//     String getDeclaringClassName();
// 
//     /**
//      * Returns an array of {@code Class} objects that represent the formal
//      * parameter types, in declaration order, of the method. Returns an array of length
//      * 0 if the underlying method takes no parameters.
//      *
//      * @return the parameter types for the method
//      */
//     Class<?>[] getParameterTypes();
// 
//     /**
//      * Returns an array of {@code String} objects that represent parameter names,
//      * in declaration order, of the method. Returns an array of length
//      * 0 if the underlying method takes no parameters.
//      *
//      * @return the parameter names for the method
//      */
//     String[] getParameterNames();
// 
//     /**
//      * Returns an array of {@code Class} objects that represent the
//      * types of exceptions declared to be thrown by the underlying
//      * method.  Returns an array of length 0 if the method declares no exceptions in its {@code
//      * throws} clause.
//      *
//      * @return the exception types declared as being thrown by the method
//      */
//     Class<?>[] getExceptionTypes();
// 
//     /**
//      * Returns a {@code Class} object that represents the formal return type
//      * of the method.
//      *
//      * @return the return type for the method this object represents
//      */
//     Class<?> getReturnType();
// 
//     /**
//      * Returns {@code Method} object reflecting the declared method.
//      *
//      * @return the {@code Method} object reflecting the declared method.
//      */
//     Method getMethod();
// 
// }


import com.icthh.xm.lep.api.LepMethod;
import com.icthh.xm.lep.api.MethodSignature;
import java.util.Arrays;
import java.util.Objects;
package com.icthh.xm.lep.api.commons;



/**
 * The {@link DefaultLepMethod} class.
 */
public class DefaultLepMethod implements LepMethod {

    private static final Object[] EMPTY_OBJ_ARRAY = new Object[0];

    private final Object target;
    private final MethodSignature methodSignature;
    private final Object[] methodArgValues;

    /**
     * LEP method constructor with method arguments.
     *
     * @param target          method target
     * @param methodSignature method signature
     * @param methodArgValues method argument values
     */
// Path: xm-lep-api/src/main/java/com/icthh/xm/lep/api/LepMethod.java
// public interface LepMethod {
// 
//     Object getTarget();
// 
//     MethodSignature getMethodSignature();
// 
//     Object[] getMethodArgValues();
// 
// }
// 
// Path: xm-lep-api/src/main/java/com/icthh/xm/lep/api/MethodSignature.java
// public interface MethodSignature {
// 
//     /**
//      * Returns the identifier part of this signature.  For methods this
//      * will return the method name.
//      *
//      * @return the identifier part of this signature
//      * @see java.lang.reflect.Member#getName
//      */
//     String getName();
// 
//     /**
//      * Returns the modifiers on this signature represented as an int.  Use
//      * the constants and helper methods defined on {@code java.lang.reflect.Modifier} to manipulate this, i.e.
//      * <pre>
//      *     // check if this signature is public
//      *     java.lang.reflect.Modifier.isPublic(sig.getModifiers());
//      *
//      *     // print out the modifiers
//      *     java.lang.reflect.Modifier.toString(sig.getModifiers());
//      * </pre>
//      *
//      * @return the modifiers on this signature represented as an int
//      * @see java.lang.reflect.Member#getModifiers
//      * @see java.lang.reflect.Modifier
//      */
//     int getModifiers();
// 
//     /**
//      * <p>Returns a {@code java.lang.Class} object representing the class,
//      * interface, or aspect (proxy) that declared this member.  For intra-member
//      * declarations, this will be the type on which the member is declared,
//      * not the type where the declaration is lexically written.  Use
//      * {@code SourceLocation.getWithinType()} to get the type in
//      * which the declaration occurs lexically.</p>
//      * <p>For consistency with {@code java.lang.reflect.Member}, this
//      * method named {@code getDeclaringClass()}.</p>
//      *
//      * @return a {@code java.lang.Class} object representing the class, interface,
//      *     or aspect (proxy) that declared this member
//      * @see java.lang.reflect.Member#getDeclaringClass
//      */
//     Class<?> getDeclaringClass();
// 
//     /**
//      * Returns the fully-qualified name of the declaring type. This is
//      * equivalent to calling getDeclaringClass().getName(), but caches
//      * the result for greater efficiency.
//      *
//      * @return the fully-qualified name of the declaring type
//      */
//     String getDeclaringClassName();
// 
//     /**
//      * Returns an array of {@code Class} objects that represent the formal
//      * parameter types, in declaration order, of the method. Returns an array of length
//      * 0 if the underlying method takes no parameters.
//      *
//      * @return the parameter types for the method
//      */
//     Class<?>[] getParameterTypes();
// 
//     /**
//      * Returns an array of {@code String} objects that represent parameter names,
//      * in declaration order, of the method. Returns an array of length
//      * 0 if the underlying method takes no parameters.
//      *
//      * @return the parameter names for the method
//      */
//     String[] getParameterNames();
// 
//     /**
//      * Returns an array of {@code Class} objects that represent the
//      * types of exceptions declared to be thrown by the underlying
//      * method.  Returns an array of length 0 if the method declares no exceptions in its {@code
//      * throws} clause.
//      *
//      * @return the exception types declared as being thrown by the method
//      */
//     Class<?>[] getExceptionTypes();
// 
//     /**
//      * Returns a {@code Class} object that represents the formal return type
//      * of the method.
//      *
//      * @return the return type for the method this object represents
//      */
//     Class<?> getReturnType();
// 
//     /**
//      * Returns {@code Method} object reflecting the declared method.
//      *
//      * @return the {@code Method} object reflecting the declared method.
//      */
//     Method getMethod();
// 
// }


// Path: xm-lep-api-commons/src/main/java/com/icthh/xm/lep/api/commons/DefaultLepMethod.java
import com.icthh.xm.lep.api.LepMethod;
import com.icthh.xm.lep.api.MethodSignature;
import java.util.Arrays;
import java.util.Objects;

package com.icthh.xm.lep.api.commons;



/**
 * The {@link DefaultLepMethod} class.
 */
public class DefaultLepMethod implements LepMethod {

    private static final Object[] EMPTY_OBJ_ARRAY = new Object[0];

    private final Object target;
    private final MethodSignature methodSignature;
    private final Object[] methodArgValues;

    /**
     * LEP method constructor with method arguments.
     *
     * @param target          method target
     * @param methodSignature method signature
     * @param methodArgValues method argument values
     */
    public DefaultLepMethod(Object target,