def parse_options argv, params = nil
params ||= options
spec, h, s = [], {}, {}
params.each do |p|
head, *tail = p.names
long = "--#{ head }"
shorts = tail.map{|t| "-#{ t }"}
type =
if p.argument_required? then GetoptLong::REQUIRED_ARGUMENT
elsif p.argument_optional? then GetoptLong::OPTIONAL_ARGUMENT
else GetoptLong::NO_ARGUMENT
end
a = [ long, shorts, type ].flatten
spec << a
h[long] = p
s[long] = a
end
begin
GetoptLong.new(argv, *spec).each do |long, value|
value =
case s[long].last
when GetoptLong::NO_ARGUMENT
value.empty? ? true : value
when GetoptLong::OPTIONAL_ARGUMENT
value.empty? ? true : value
when GetoptLong::REQUIRED_ARGUMENT
value
end
p = h[long]
p.add_value value
end
rescue GetoptLong::AmbigousOption, GetoptLong::NeedlessArgument,
GetoptLong::MissingArgument, GetoptLong::InvalidOption => e
c = Parameter.const_get e.class.name.split(/::/).last
ex = c.new e.message
ex.set_backtrace e.message
ex.extend Softspoken
raise ex
end
??
end