class HadoopREPL extends REPL {

    @Override
    protected void evaluate(final String input) throws ExitSignal {
        popHistory();
        final Iterable<String> inputParts = ARG_SPLITTER.limit(2).split(input);
        if (Iterables.isEmpty(inputParts)) {
             // Do nothing
        } else {
            final String command = Iterables.get(inputParts, 0).toLowerCase();
            if (commandMappings.containsKey(call(command))) {
                commandMappings.get(call(command)).execute(
                    new CommandInvocation(command, Iterables.toArray(ARG_SPLITTER.split(Iterables.get(inputParts, 1, "")), String.class)),
                    sessionState
                );
            } else {
                sessionState.output("Unknown command \"%s\"", command);
            }
            pushHistory(input);
        }
    }

    public  HadoopREPL(final Configuration configuration);
    public  HadoopREPL(final Configuration configuration, final SessionState sessionState);
    public  HadoopREPL(final Configuration configuration, final SessionState sessionState, final Map<Call, Command> commandMappings);

}