def add(rule_class, attribute_names, options = {}, &block)
      context_names = extract_context_names(options)

      attribute_names.each do |attribute_name|
        rules = rule_class.rules_for(attribute_name, options, &block)

        context_names.each { |context| add_rules_to_context(context, rules) }
      end

      self
    end
def add(rule_class, attribute_names, options = {}, &block)
      context_names = extract_context_names(options)

      attribute_names.each do |attribute_name|
        rules = rule_class.rules_for(attribute_name, options, &block)

        context_names.each { |context| add_rules_to_context(context, rules) }
      end

      self
    end
Create a new rule of the given class for each name in +attribute_names+
 and add the rules to the RuleSet(s) indicated

 @param [Aequitas::Rule] rule_class
    Rule class, example: Aequitas::Rule::Presence

 @param [Array<Symbol>] attribute_names
    Attribute names given to validation macro, example:
    [:first_name, :last_name] in validates_presence_of :first_name, :last_name

 @param [Hash] options
    Options supplied to validation macro, example:
    {:maximum=>50, :allow_nil=>true}

 @option [Symbol] :context, :group, :when, :on
   the context in which the new rule should be run

 @return [self]

 @api private

 TODO: push responsibility for the array of attribute_names out to methods
   in Aequitas::Macros.