module Formulario
  class Field
    class Collection < Field
      include Enumerable

      def fields
        raw_value
      end

      def values
        fields.map(&:value)
      end
      alias :value :values

      def self.[](type)
        Class.new(self).tap { |typed_class|
          typed_class.field_types = type_for(type)
        }
      end

      def exceptional?
        fields.any?(&:exceptional?)
      end

      def each(&block)
        fields.each(&block)
      end

      private

      def self.build(raw_value)
        new Array(raw_value).map { |value|
          field_types.for(value)
        }
      end

      def self.field_types
        @field_types ||= Field
      end

      def self.field_types=(type)
        @field_types = type
      end
    end
  end
end