// Path: src/main/java/com/jenkov/container/itf/factory/ILocalFactory.java
// public interface ILocalFactory {
// 
//      public Class getReturnType();
// 
//     /**
//      * This method is intended to be called *internally between* factories when creating
//      * an instance of some class. It is not intended to be called directly by client code,
//      * or from the Container. For that purpose use the instance(Object ... parameters)
//      * method. If you do call this method directly, a null will suffice for the localProducts
//      * array.
//      *
//      * NOTE: Only called on local factories. Never on global factories.
//      *
//      * <br/><br/>
//      * If you develop a custom IFactory implementation you should
//      * extend LocalFactoryBase and override this method, not the instance(Object ... parameters)
//      * method. If your factory implementation calls any other factories it should pass on
//      * both the parameters and localProducts object arrays!!
//      * ... as in factory.instance(parameters, localProducts); .
//      *  Do not just call the instance() or instance(parameters) method.
//      *
//      * @param parameters
//      * @param localProducts
//      * @return The created object.
//      */
//     public Object instance(Object[] parameters, Object[] localProducts);
// }
// 
// Path: src/main/java/com/jenkov/container/itf/factory/FactoryException.java
// public class FactoryException extends ContainerException {
//     public FactoryException(String errorContext, String errorCode, String errorMessage) {
//         super(errorContext, errorCode, errorMessage);
//     }
// 
//     public FactoryException(String errorContext, String errorCode, String errorMessage, Throwable cause) {
//         super(errorContext, errorCode, errorMessage, cause);
//     }
// 
// }


import com.jenkov.container.itf.factory.ILocalFactory;
import com.jenkov.container.itf.factory.FactoryException;
import java.lang.reflect.Method;
import java.util.List;
import java.util.ArrayList;
            } else {
                return returnValue;
            }

        } catch (Throwable t){
            throw new FactoryException(
                    "InstanceMethodFactory", "INSTANTIATION_ERROR",
                    "Error instantiating object from instance method [" + this.method +"]", t);
        }finally{
            for(int j=0; j<arguments.length; j++)arguments[j] = null;
        }
    }

    public String toString() {
        StringBuilder builder = new StringBuilder();
        builder.append("<InstanceMethodFactory: ");
        builder.append(method);
        builder.append("> --> ");

        builder.append(this.methodInvocationTargetFactory);

        return builder.toString();
    }

    //this method is added only for testability. It is not part of the IFactory interface.
    public ILocalFactory getMethodInvocationTargetFactory() {
        return methodInvocationTargetFactory;
    }

    public Method getMethod() {
// Path: src/main/java/com/jenkov/container/itf/factory/ILocalFactory.java
// public interface ILocalFactory {
// 
//      public Class getReturnType();
// 
//     /**
//      * This method is intended to be called *internally between* factories when creating
//      * an instance of some class. It is not intended to be called directly by client code,
//      * or from the Container. For that purpose use the instance(Object ... parameters)
//      * method. If you do call this method directly, a null will suffice for the localProducts
//      * array.
//      *
//      * NOTE: Only called on local factories. Never on global factories.
//      *
//      * <br/><br/>
//      * If you develop a custom IFactory implementation you should
//      * extend LocalFactoryBase and override this method, not the instance(Object ... parameters)
//      * method. If your factory implementation calls any other factories it should pass on
//      * both the parameters and localProducts object arrays!!
//      * ... as in factory.instance(parameters, localProducts); .
//      *  Do not just call the instance() or instance(parameters) method.
//      *
//      * @param parameters
//      * @param localProducts
//      * @return The created object.
//      */
//     public Object instance(Object[] parameters, Object[] localProducts);
// }
// 
// Path: src/main/java/com/jenkov/container/itf/factory/FactoryException.java
// public class FactoryException extends ContainerException {
//     public FactoryException(String errorContext, String errorCode, String errorMessage) {
//         super(errorContext, errorCode, errorMessage);
//     }
// 
//     public FactoryException(String errorContext, String errorCode, String errorMessage, Throwable cause) {
//         super(errorContext, errorCode, errorMessage, cause);
//     }
// 
// }


// Path: src/main/java/com/jenkov/container/impl/factory/InstanceMethodFactory.java
import com.jenkov.container.itf.factory.ILocalFactory;
import com.jenkov.container.itf.factory.FactoryException;
import java.lang.reflect.Method;
import java.util.List;
import java.util.ArrayList;

            } else {
                return returnValue;
            }

        } catch (Throwable t){
            throw new FactoryException(
                    "InstanceMethodFactory", "INSTANTIATION_ERROR",
                    "Error instantiating object from instance method [" + this.method +"]", t);
        }finally{
            for(int j=0; j<arguments.length; j++)arguments[j] = null;
        }
    }

    public String toString() {
        StringBuilder builder = new StringBuilder();
        builder.append("<InstanceMethodFactory: ");
        builder.append(method);
        builder.append("> --> ");

        builder.append(this.methodInvocationTargetFactory);

        return builder.toString();
    }

    //this method is added only for testability. It is not part of the IFactory interface.
    public ILocalFactory getMethodInvocationTargetFactory() {
        return methodInvocationTargetFactory;
    }

    public Method getMethod() {
        return method;