@Override
    public void start() throws ConsoleException {
        if(isStarted) throw new ConsoleException("Console has already been run");
        isStarted = true;
        completer.getStrings().clear();
        completer.getStrings().addAll(commands.keySet());
        String line;
        try {
            while(isStarted && (line = reader.readLine()) != null) {
                List<String> tokens = tokenizer.tokenize(line);
                String alias;
                if(!tokens.isEmpty() && (alias = tokens.get(0)) != null && commands.containsKey(alias)) {
                    tokens.remove(0);
                    commands.get(alias).perform(tokens);
                } else {
                    out.println(usage != null ? usage : "Unknown command, press TAB to list available ones");
                }
            }
        } catch (UserInterruptException e) {
            stop();
        } catch (IOException e) {
            throw new ConsoleException(e);
        }
    }