def update_selector(attributes, operator, combine = :+)
clone.tap do |crit|
converted = BSON::ObjectId.convert(klass, attributes || {})
converted.each_pair do |key, value|
existing = crit.selector[key]
unless existing
crit.selector[key] = { operator => value }
else
if existing.respond_to?(:merge)
if existing.has_key?(operator)
new_value = existing.values.first.send(combine, value)
crit.selector[key] = { operator => new_value }
else
crit.selector[key][operator] = value
end
else
crit.selector[key] = { operator => value }
end
end
end
end
end