module Yema class Rule include Equalizer.new(:attribute_name) attr_reader :attribute_name def initialize(attribute_name, options={}) assert_required_options(options) @attribute_name = attribute_name end def self.required_options [] end def validate(resource) Validator.new(self, resource) end def errors(resource) validate(resource).errors end private def assert_required_options(options) shortage = self.class.required_options - options.keys raise InvalidOptionError, "Missing options: #{shortage.inspect}" unless shortage.empty? end end end