    public void script(
            @CliOption(key = { "", "file" }, help = "The file to locate and execute", mandatory = true) final File script,
            @CliOption(key = "lineNumbers", mandatory = false, specifiedDefaultValue = "true", unspecifiedDefaultValue = "false", help = "Display line numbers when executing the script") final boolean lineNumbers) {
        Validate.notNull(script, "Script file to parse is required");
        final double startedNanoseconds = System.nanoTime();
        final InputStream inputStream = openScript(script);
        try {
            int i = 0;
            for (final String line : IOUtils.readLines(inputStream)) {
                i++;
                if (lineNumbers) {
                    logger.fine("Line " + i + ": " + line);
                }
                else {
                    logger.fine(line);
                }
                if (!"".equals(line.trim())) {
                    final boolean success = executeScriptLine(line);
                    if (success
                            && (line.trim().startsWith("q") || line.trim()
                                    .startsWith("ex"))) {
                        break;
                    }
                    else if (!success) {
                        throw new IllegalStateException(
                                "Script execution aborted");
                    }
                }
            }
        }
        catch (final IOException e) {
            throw new IllegalStateException(e);
        }
        finally {
            IOUtils.closeQuietly(inputStream);
            final double executionDurationInSeconds = (System.nanoTime() - startedNanoseconds) / 1000000000D;
            logger.fine("Script required "
                    + round(executionDurationInSeconds, 3)
                    + " seconds to execute");
        }
    }
    public void setPromptPath(final String path) {
        shellPrompt = (StringUtils.isNotBlank(path) ? path + " " : "")
                + ROO_PROMPT;
    }
    public void setPromptPath(final String path, final boolean overrideStyle) {
        setPromptPath(path);
    }
    public void setTailor(final Tailor tailor) {
        this.tailor = tailor;
    }
    @CliCommand(value = { "version" }, help = "Displays shell version")
    public String version(
            @CliOption(key = "", help = "Special version flags") final String extra) {
        final StringBuilder sb = new StringBuilder();
        if ("roorocks".equals(extra)) {
            sb.append("               /\\ /l").append(LINE_SEPARATOR);
            sb.append("               ((.Y(!").append(LINE_SEPARATOR);
            sb.append("                \\ |/").append(LINE_SEPARATOR);
            sb.append("                /  6~6,").append(LINE_SEPARATOR);
            sb.append("                \\ _    +-.").append(LINE_SEPARATOR);
            sb.append("                 \\`-=--^-' \\").append(LINE_SEPARATOR);
            sb.append(
                    "                  \\   \\     |\\--------------------------+")
                    .append(LINE_SEPARATOR);
            sb.append(
                    "                 _/    \\    |  Thanks for loading Roo!  |")
                    .append(LINE_SEPARATOR);
            sb.append(
                    "                (  .    Y   +---------------------------+")
                    .append(LINE_SEPARATOR);
            sb.append("               /\"\\ `---^--v---.").append(
                    LINE_SEPARATOR);
            sb.append("              / _ `---\"T~~\\/~\\/").append(
                    LINE_SEPARATOR);
            sb.append("             / \" ~\\.      !").append(LINE_SEPARATOR);
            sb.append("       _    Y      Y.~~~ /'").append(LINE_SEPARATOR);
            sb.append("      Y^|   |      | Roo 7").append(LINE_SEPARATOR);
            sb.append("      | l   |     / .   /'").append(LINE_SEPARATOR);
            sb.append("      | `L  | Y .^/   ~T").append(LINE_SEPARATOR);
            sb.append("      |  l  ! | |/  | |               ____  ____  ____")
                    .append(LINE_SEPARATOR);
            sb.append(
                    "      | .`\\/' | Y   | !              / __ \\/ __ \\/ __ \\")
                    .append(LINE_SEPARATOR);
            sb.append(
                    "      l  \"~   j l   j L______       / /_/ / / / / / / /")
                    .append(LINE_SEPARATOR);
            sb.append(
                    "       \\,____{ __\"\" ~ __ ,\\_,\\_    / _, _/ /_/ / /_/ /")
                    .append(LINE_SEPARATOR);
            sb.append("    ~~~~~~~~~~~~~~~~~~~~~~~~~~~   /_/ |_|\\____/\\____/")
                    .append(" ").append(versionInfo()).append(LINE_SEPARATOR);
            return sb.toString();
        }
        sb.append("    ____  ____  ____  ").append(LINE_SEPARATOR);
        sb.append("   / __ \\/ __ \\/ __ \\ ").append(LINE_SEPARATOR);
        sb.append("  / /_/ / / / / / / / ").append(LINE_SEPARATOR);
        sb.append(" / _, _/ /_/ / /_/ /  ").append("  ")
                .append("gvNIX 1.2.1-SNAPSHOT distribution").append(LINE_SEPARATOR);
        sb.append("/_/ |_|\\____/\\____/   ").append(" ").append(versionInfo())
                .append(LINE_SEPARATOR);
        sb.append(LINE_SEPARATOR);
        return sb.toString();
    }
}

    public void script(
            @CliOption(key = { "", "file" }, help = "The file to locate and execute", mandatory = true) final File script,
            @CliOption(key = "lineNumbers", mandatory = false, specifiedDefaultValue = "true", unspecifiedDefaultValue = "false", help = "Display line numbers when executing the script") final boolean lineNumbers) {
        Validate.notNull(script, "Script file to parse is required");
        final double startedNanoseconds = System.nanoTime();
        final InputStream inputStream = openScript(script);
        try {
            int i = 0;
            for (final String line : IOUtils.readLines(inputStream)) {
                i++;
                if (lineNumbers) {
                    logger.fine("Line " + i + ": " + line);
                }
                else {
                    logger.fine(line);
                }
                if (!"".equals(line.trim())) {
                    final boolean success = executeScriptLine(line);
                    if (success
                            && (line.trim().startsWith("q") || line.trim()
                                    .startsWith("ex"))) {
                        break;
                    }
                    else if (!success) {
                        throw new IllegalStateException(
                                "Script execution aborted");
                    }
                }
            }
        }
        catch (final IOException e) {
            throw new IllegalStateException(e);
        }
        finally {
            IOUtils.closeQuietly(inputStream);
            final double executionDurationInSeconds = (System.nanoTime() - startedNanoseconds) / 1000000000D;
            logger.fine("Script required "
                    + round(executionDurationInSeconds, 3)
                    + " seconds to execute");
        }
    }
    public void setPromptPath(final String path) {
        shellPrompt = (StringUtils.isNotBlank(path) ? path + " " : "")
                + ROO_PROMPT;
    }
    public void setPromptPath(final String path, final boolean overrideStyle) {
        setPromptPath(path);
    }
    public void setTailor(final Tailor tailor) {
        this.tailor = tailor;
    }
    @CliCommand(value = { "version" }, help = "Displays shell version")
    public String version(
            @CliOption(key = "", help = "Special version flags") final String extra) {
        final StringBuilder sb = new StringBuilder();
        if ("roorocks".equals(extra)) {
            sb.append("               /\\ /l").append(LINE_SEPARATOR);
            sb.append("               ((.Y(!").append(LINE_SEPARATOR);
            sb.append("                \\ |/").append(LINE_SEPARATOR);
            sb.append("                /  6~6,").append(LINE_SEPARATOR);
            sb.append("                \\ _    +-.").append(LINE_SEPARATOR);
            sb.append("                 \\`-=--^-' \\").append(LINE_SEPARATOR);
            sb.append(
                    "                  \\   \\     |\\--------------------------+")
                    .append(LINE_SEPARATOR);
            sb.append(
                    "                 _/    \\    |  Thanks for loading Roo!  |")
                    .append(LINE_SEPARATOR);
            sb.append(
                    "                (  .    Y   +---------------------------+")
                    .append(LINE_SEPARATOR);
            sb.append("               /\"\\ `---^--v---.").append(
                    LINE_SEPARATOR);
            sb.append("              / _ `---\"T~~\\/~\\/").append(
                    LINE_SEPARATOR);
            sb.append("             / \" ~\\.      !").append(LINE_SEPARATOR);
            sb.append("       _    Y      Y.~~~ /'").append(LINE_SEPARATOR);
            sb.append("      Y^|   |      | Roo 7").append(LINE_SEPARATOR);
            sb.append("      | l   |     / .   /'").append(LINE_SEPARATOR);
            sb.append("      | `L  | Y .^/   ~T").append(LINE_SEPARATOR);
            sb.append("      |  l  ! | |/  | |               ____  ____  ____")
                    .append(LINE_SEPARATOR);
            sb.append(
                    "      | .`\\/' | Y   | !              / __ \\/ __ \\/ __ \\")
                    .append(LINE_SEPARATOR);
            sb.append(
                    "      l  \"~   j l   j L______       / /_/ / / / / / / /")
                    .append(LINE_SEPARATOR);
            sb.append(
                    "       \\,____{ __\"\" ~ __ ,\\_,\\_    / _, _/ /_/ / /_/ /")
                    .append(LINE_SEPARATOR);
            sb.append("    ~~~~~~~~~~~~~~~~~~~~~~~~~~~   /_/ |_|\\____/\\____/")
                    .append(" ").append(versionInfo()).append(LINE_SEPARATOR);
            return sb.toString();
        }
        sb.append("    ____  ____  ____  ").append(LINE_SEPARATOR);
        sb.append("   / __ \\/ __ \\/ __ \\ ").append(LINE_SEPARATOR);
        sb.append("  / /_/ / / / / / / / ").append(LINE_SEPARATOR);
        sb.append(" / _, _/ /_/ / /_/ /  ").append("  ")
                .append("gvNIX 1.3.0-SNAPSHOT distribution").append(LINE_SEPARATOR);
        sb.append("/_/ |_|\\____/\\____/   ").append(" ").append(versionInfo())
                .append(LINE_SEPARATOR);
        sb.append(LINE_SEPARATOR);
        return sb.toString();
    }
}
