def validate? (attr_validator, object = nil, hash_or_attr = nil)
object ||= attr_validator.object
hash_or_attr ||= @attr_hash
return false unless object
case hash_or_attr
when Symbol
attr_value = object_attribute_value(object, hash_or_attr)
case attr_value
when nil
raise NilAttributeValueError, "Attribute #{hash_or_attr.inspect} is nil in #{object.inspect}."
when Enumerable
attr_value.any? do |inner_value|
attr_validator.engine.permit? @privilege, :object => inner_value, :user => attr_validator.user
end
else
attr_validator.engine.permit? @privilege, :object => attr_value, :user => attr_validator.user
end
when Hash
hash_or_attr.all? do |attr, sub_hash|
attr_value = object_attribute_value(object, attr)
if attr_value == nil
raise NilAttributeValueError, "Attribute #{attr.inspect} is nil in #{object.inspect}."
elsif attr_value.is_a?(Enumerable)
attr_value.any? do |inner_value|
validate?(attr_validator, inner_value, sub_hash)
end
else
validate?(attr_validator, attr_value, sub_hash)
end
end
when NilClass
attr_validator.engine.permit? @privilege, :object => object, :user => attr_validator.user
else
raise AuthorizationError, "Wrong conditions hash format: #{hash_or_attr.inspect}"
end
end