def validate(value, context = nil)
raise format_error("hash value", context) unless
value.respond_to?(:to_hash)
context = context_description(context)
value.each do |name, v|
name = name.to_s
raise ArgumentError.new("unexpected key #{name} for #{context}") unless
member_option(name)
member_option(name).validate(v, "key #{name} of #{context}")
end
member_options.each do |option|
raise ArgumentError.new("missing required key #{option.ruby_name} for #{context}") if
option.required? and
!value.has_key?(option.ruby_name) and
!value.has_key?(option.ruby_name.to_sym)
end
end