module Rulz module Attribute class Block def initialize(attr, klass, &block) @attr = attr @klass = klass instance_eval &block end def condition(name, &block) Rulz::Attribute::Condition.new(@klass, @attr, name, block) end def type(kind) Rulz::Conditions.load_conditions(@klass, @attr, kind) end end class Condition attr_reader :name, :proc def initialize(klass, attr, name, proc) @name = name @proc = proc klass.instance_exec self do |condition| conditions = instance_variable_get("@rulz_#{attr}_conditions") || [] conditions << condition instance_variable_set("@rulz_#{attr}_conditions", conditions) end end def self.find(klass, attr, name) result = klass.instance_variable_get("@rulz_#{attr}_conditions").find {|c| c.name == name } raise ArgumentError, "Condition '#{name}' for '#{attr}' does not exist" unless result result end end end end