def opt_parser
@opt_parser ||= OptionParser.new do |opts|
opts.banner = banner
options.sort { |a, b| a[0].to_s <=> b[0].to_s }.each do |opt_key, opt_val|
opt_args = build_option_arguments(opt_val)
opt_method = case opt_val[:on]
when :on
:on
when :tail
:on_tail
when :head
:on_head
else
raise ArgumentError, "You must pass :on, :tail, or :head to :on"
end
parse_block =
Proc.new() do |c|
config[opt_key] = if opt_val[:proc]
if opt_val[:proc].arity == 2
opt_val[:proc].call(c, config[opt_key])
else
opt_val[:proc].call(c)
end
else
c
end
puts opts if opt_val[:show_options]
exit opt_val[:exit] if opt_val[:exit]
end
full_opt = [ opt_method ]
opt_args.inject(full_opt) { |memo, arg| memo << arg; memo }
full_opt << parse_block
opts.send(*full_opt)
end
end
end