def has(cardinality, name, options = {})
if name.kind_of?(Hash)
name_through, through = name.keys.first, name.values.first
cardinality_string = cardinality.to_s == 'Infinity' ? 'n' : cardinality.inspect
warn("In #{self.name} 'has #{cardinality_string}, #{name_through.inspect} => #{through.inspect}' is deprecated. Use 'has #{cardinality_string}, #{name_through.inspect}, :through => #{through.inspect}' instead")
end
options = options.merge(extract_min_max(cardinality))
options = options.merge(extract_throughness(name))
if options[:min] == n && options[:max] == n
raise ArgumentError, 'Cardinality may not be n..n. The cardinality specifies the min/max number of results from the association', caller
end
klass = options[:max] == 1 ? OneToOne : OneToMany
klass = ManyToMany if options[:through] == DataMapper::Resource
relationship = klass.setup(options.delete(:name), self, options)
self.init_has_relationship_for_serialization(relationship) if self.respond_to?(:init_has_relationship_for_serialization)
relationship
end