BasicCommand < Object {

banner: ""
width:  30
options_config: null

options_parse: |*argv| {
  command = argv.first && self.commands.memes[argv.first.to_sym]
  command
    &? (command.result.run(*argv.slice(Range.new(1, -1))); null)
    ?? options_parser.parse(argv)
}

options_parser: {
  parser = Rubinius::Options.new(banner, width, options_config)
  options.memes.each |name, meme| {
    meme.result.register_in_parser(parser, name)
  }
  parser.help
  parser
}

show_help: puts(options_parser.to_s)

Option < Object {
  var parser

  register_in_parser: |parser, name| {
    self.parser = parser

    args = [name, (self.?argument ?? null), long_form, description]
    args = args.compact
    args = args.map |arg| { arg.to_s }

    parser.on(*args) |arg| { do(arg) }
  }
}

# Empty categories to be filled by the user
[options]
[commands]

}