module Formulario class Field class Collection < Field include Enumerable def self.[](type) Class.new(self).tap { |typed_class| typed_class.fields_type = type } end def fields raw_value end def exceptional? fields.any?(&:exceptional?) end def each(&block) fields.each(&block) end def values map(&:value) end private def self.build(raw_values) new( Array(raw_values).map { |raw_value| fields_type.for(raw_value) } ) end def self.fields_type @fields_type ||= Field end def self.fields_type=(type) @fields_type = type_for(type) end end end end