def validate_args_and_options(args_metadata, options_metadata, args)
options_metadata.each do |option_meta|
arg = option_meta[:arg]
context_helper = option_meta[:context_helper]
@options.__hash__[arg] = self.send(context_helper) if @options.__hash__[arg].nil? and context_helper
raise ArgumentError.new("Missing required option '#{arg}'.") if option_meta[:required] and @options.__hash__[arg].nil?
end
arg_slots = [].fill(nil, 0, args_metadata.length)
fill_args = args.reverse
args_metadata.each_with_index do |arg_meta, i|
value = @options.__hash__[arg_meta[:name]]
if value
arg_slots[i] = value
elsif arg_meta[:arg_type] == :list
arg_slots[i] = fill_args.reverse
fill_args = []
else
raise ArgumentError.new("Missing required argument '#{arg_meta[:name]}'.") if fill_args.empty?
arg_slots[i] = fill_args.pop
end
end
raise ArgumentError.new("Too many arguments passed in.") unless fill_args.empty?
arg_slots
end