import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;

/**
 * @author Anastasiya Solodkaya.
 */
public class CountedLoopProposal14 {
    public static void main(String[] args) throws Throwable {
        MethodHandle methodHandle0 = MethodHandles.countedLoop(
                null,
                null,
                MethodSet.body(void.class, int.class));
        System.out.println("methodHandle.type() = " + methodHandle0.type());
    }

    static class MethodSet {

        static void bodyVoid(int counter) {
        }

        static MethodHandle body(Class returnType, Class... params) {
            return findStatic("body", returnType, params);
        }

        private static MethodHandle findStatic(String prefix, Class returnType, Class[] params) {
            try {
                String simpleName = returnType.getSimpleName();
                simpleName = simpleName.substring(0, 1).toUpperCase() + simpleName.substring(1);
                return MethodHandles.lookup().findStatic(MethodSet.class, prefix + simpleName, MethodType.methodType(returnType, params));
            } catch (NoSuchMethodException | IllegalAccessException e) {
                e.printStackTrace();
                return null;
            }
        }


    }

}
