class Hiiro::Options

def self.new(args = nil, &block)

Support both: new(&block) for setup, or new(args, &block) for parse
def self.new(args = nil, &block)
  instance = allocate
  instance.send(:base_initialize, &block)
  if args
    instance.parse!(args)
  else
    instance
  end
end

def self.parse(args, &block)

def self.parse(args, &block)
  new(&block).parse!(args)
end

def self.setup(&block)

def self.setup(&block)
  new(&block)
end

def base_initialize(&block)

def base_initialize(&block)
itions = {}
help, short: 'h', desc: 'Show this help message')
ce_eval(&block) if block

def flag(name, short: nil, default: false, desc: nil)

def flag(name, short: nil, default: false, desc: nil)
  defn = Definition.new(name, short: short, type: :flag, default: default, desc: desc)
  @definitions[name.to_sym] = defn
  self
end

def help_text

def help_text
  lines = []
  @definitions.each do |name, defn|
    next if name == :help
    lines << defn.usage_line
  end
  lines << @definitions[:help].usage_line
  lines.join("\n")
end

def initialize(&block)

def initialize(&block)
  base_initialize(&block)
end

def option(name, short: nil, type: :string, default: nil, desc: nil, multi: false)

def option(name, short: nil, type: :string, default: nil, desc: nil, multi: false)
  defn = Definition.new(name, short: short, type: type, default: default, desc: desc, multi: multi)
  @definitions[name.to_sym] = defn
  self
end

def parse(args)

def parse(args)
  Args.new(@definitions, args.flatten.compact)
end

def parse!(args)

def parse!(args)
  parse(args)
end