we can come back and do a little metaprogramming later, but if you make NoOpCommand take (and do nothing with) the @terminal value, you could do:

    cmd = eval "#{keys}.#{key}"
    cmd.capitalize! << "Command"
    klass = eval cmd
    klass.new(@terminal)

No more case statement, automatically supports new commands -- so long as they only adhere to that interface.

Not a blocker.