# File lib/mongoid/multi_parameter_attributes.rb, line 51
    def process(attrs = nil, role = :default, guard_protected_attributes = true)
      if attrs
        errors = []
        attributes = {}
        multi_parameter_attributes = {}

        attrs.each_pair do |key, value|
          if key =~ /^([^\(]+)\((\d+)([if])\)$/
            key, index = $1, $2.to_i
            (multi_parameter_attributes[key] ||= {})[index] = value.empty? ? nil : value.send("to_#{$3}")
          else
            attributes[key] = value
          end
        end

        multi_parameter_attributes.each_pair do |key, values|
          begin
            values = (values.keys.min..values.keys.max).map { |i| values[i] }
            field = self.class.fields[key]
            attributes[key] = instantiate_object(field, values)
          rescue => e
            errors << Errors::AttributeAssignmentError.new(
              "error on assignment #{values.inspect} to #{key}", e, key
            )
          end
        end

        unless errors.empty?
          raise(
            Errors::MultiparameterAssignmentErrors.new(errors),
            "#{errors.size} error(s) on assignment of multiparameter attributes"
          )
        end

        super attributes, role, guard_protected_attributes
      else
        super
      end
    end