# Module containing methods responsible for searching ActiveRepository objects
module ActiveRepository #:nodoc:
  module Finders #:nodoc:
    # Searches for an object containing the id in #id
    def find(id)
      begin
        if repository?
          super(id)
        else
          serialize!(PersistenceAdapter.find(self, id))
        end
      rescue Exception => e
        message = "Couldn't find #{self} with ID=#{id}"
        message = "Couldn't find all #{self} objects with IDs (#{id.join(', ')})" if id.is_a?(Array)

        raise ActiveHash::RecordNotFound.new(message)
      end
    end

    # Returns first persisted object
    def first
      repository? ? super : get(:first)
    end

    # Returns last persisted object
    def last
      repository? ? super : get(:last)
    end

    private
    # Returns the object in the position specified in #position
    def get(position)
      object = PersistenceAdapter.send(position, self)
      object.present? ? serialize!(object.attributes) : nil
    end
  end
end