module Yaks
  class Mapper
    class HasMany < Association
      include Util

      def initialize(options)
        super
        @collection_mapper = options.fetch(:collection_mapper, Undefined)
      end

      def map_resource(collection, context)
        return NullResource.new(collection: true) if collection.nil?
        policy      = context.fetch(:policy)
        item_mapper = resolve_association_mapper(policy)
        context     = context.merge(item_mapper: item_mapper)
        collection_mapper(collection, policy).new(context).call(collection)
      end

      def collection_mapper(collection, policy)
        return @collection_mapper unless @collection_mapper.equal? Undefined
        policy.derive_mapper_from_object(collection)
      end

      def singular_name
        singularize(name.to_s)
      end
    end
  end
end
