def method_missing(name, *args, &block)
case name.to_s
when /!$/ then
name = $`.intern
if args.size < 1 || args.size > 2
raise ArgumentError.new("wrong number of arguments for #{name}!(spec, version_requirement?)")
end
need name => args.first
get(name).tap { |r| r.requirement = args.last if args.size == 2 }
when /=$/ then use $` => args.first
when /\?$/ then
name = $`.gsub(/^(has|have)_/, '').intern
[get(name)].flatten.all? { |a| a && a.selected? }
else
if block || args.size > 0
raise ArgumentError.new("wrong number of arguments #{args.size} for 0 or block given")
end
get(name)
end
end