def initialize(name, child_model, parent_model, options = {})
initialize_object_ivar('child_model', child_model)
initialize_object_ivar('parent_model', parent_model)
@name = name
@instance_variable_name = "@#{@name}".freeze
@options = options.dup.freeze
@child_repository_name = @options[:child_repository_name]
@parent_repository_name = @options[:parent_repository_name]
unless @options[:child_key].nil?
@child_properties = DataMapper::Ext.try_dup(@options[:child_key]).freeze
end
unless @options[:parent_key].nil?
@parent_properties = DataMapper::Ext.try_dup(@options[:parent_key]).freeze
end
@min = @options[:min]
@max = @options[:max]
@reader_visibility = @options.fetch(:reader_visibility, :public)
@writer_visibility = @options.fetch(:writer_visibility, :public)
@default = @options.fetch(:default, nil)
@query = DataMapper::Ext::Hash.except(@options, *self.class::OPTIONS).freeze
end