class ReeMapper::MapperFactory

def array(field_name = nil, each: nil, optional: false, key: nil, **opts, &blk)

def array(field_name = nil, each: nil, optional: false, key: nil, **opts, &blk)
  raise ReeMapper::Error, "invalid DSL usage" unless @mapper
  raise ArgumentError, "array item can't be optional" if field_name.nil? && optional
  raise ArgumentError, 'array type should use either :each or :block' if each && blk || !each && !blk
  raise ArgumentError, 'invalid :key option value' unless HASH_KEY_OPTION_VALUES.include?(key)
  if blk
    each = ReeMapper::Field.new(
      hash_from_blk(key: key, &blk)
    )
  end
  type = ReeMapper::Mapper.build(@mapper.strategies, ReeMapper::Array.new(each))
  return ReeMapper::Field.new(type, optional: optional, **opts) unless field_name
  @mapper.add_field(type, field_name, optional: optional, **opts)
end