def call(parent_key, key, value)
case value
when Array, Set
if object_id?(parent_key)
value = value.map { |v| to_object_id(v) }
end
if nesting_operator?(key)
value.map { |v| criteria_hash_class.new(v, options).to_hash }
elsif parent_key == key && !modifier?(key) && !value.empty?
{:$in => value.to_a}
else
value.to_a
end
when Time
value.utc
when String
if object_id?(key)
return to_object_id(value)
end
value
when Hash
value.each { |k, v| value[k] = call(key, k, v) }
value
when Regexp
Regexp.new(value)
else
value
end
end