class ActiveFedora::Associations::Builder::Orders

def self.build(model, name, options)

def self.build(model, name, options)
  options = { unordered_reflection: unordered_reflection(model, name) }.merge(options)
  name = :"ordered_#{name.to_s.singularize}_proxies"
  model.property :head, predicate: ::RDF::Vocab::IANA['first']
  model.property :tail, predicate: ::RDF::Vocab::IANA.last
  model.send(:define_method, :apply_first_and_last) do
    source = send(options[:through])
    source.save
    return if head.map(&:rdf_subject) == source.head_id && tail.map(&:rdf_subject) == source.tail_id
    self.head = source.head_id
    self.tail = source.tail_id
    save! if changed?
  end
  model.include ActiveFedora::Associations::Builder::Orders::FixFirstLast
  super
end

def self.define_readers(mixin, name)

def self.define_readers(mixin, name)
  super
  mixin.redefine_method(target_accessor(name)) do
    association(name).target_reader
  end
  mixin.redefine_method("#{target_accessor(name)}=") do |nodes|
    association(name).target_writer(nodes)
  end
end

def self.macro

def self.macro
  :orders
end

def self.target_accessor(name)

def self.target_accessor(name)
  name.to_s.gsub("_proxies", "").pluralize
end

def self.unordered_reflection(model, original_name)

def self.unordered_reflection(model, original_name)
  model._reflect_on_association(original_name)
end

def self.valid_options(options)

def self.valid_options(options)
  super + [:through, :unordered_reflection]
end