public static void main(String[] args) throws Exception {
        if (args.length == 0) {
            System.out.println(Main.class.getSimpleName() + " [runner fully qualified java class name] arguments ...");
            return;
        }
        System.out.println("+Argument info:");
        StringBuilder argsStr = new StringBuilder();
        for (int i = 0; i < args.length; i++) {
            argsStr.append("(" + (i + 1) + ") " + args[i] + " [" + args[i].length() + " chars]");
            if (i + 1 != args.length) {
                argsStr.append(" ");
            }
        }
        System.out.println(argsStr);
        Map<String, Object> sysInfo = getRuntimeInfo();
        System.out.println("+Runtime info:");
        for (Entry<String, Object> e : sysInfo.entrySet()) {
            System.out.println("--- " + e.getKey() + " => " + (e.getValue() == null ? "" : e.getValue()));
        }
        String classToRun = args[0];
        Class<?> testToRun = KlassUtils.getClassForName(classToRun);
        if (KlassUtils.isAbstract(testToRun) || KlassUtils.isInterface(testToRun)) {
            System.out.println("+Runner class name that is not abstract or an interface is required!");
            return;
        }
        if (ClassUtils.isAssignable(testToRun, (Runner.class)) == false) {
            System.out.println("+Runner class name that is a instance/subclass of " + Runner.class.getSimpleName() + " is required!");
            return;
        }
        Class<Runner> rToRun = KlassUtils.getClassForName(classToRun);
        System.out.println("+Running program specified by runner class " + rToRun);
        Runner r = KlassUtils.getInstanceOf(rToRun, new Object[] {});
        String[] nargs = (String[]) ArrayUtils.subarray(args, 1, args.length);
        System.out.println("+Proxying to object " + r + " with arguments [" + StringUtils.join(nargs, ",") + "]");
        r.runProgram(nargs);
    }