class Rulz::Evaluator::Rule

Public Class Methods

new(receiver, proc) click to toggle source
# File lib/rulz/evaluator.rb, line 82
def initialize(receiver, proc)
  @receiver = receiver
  @proc = proc
end

Public Instance Methods

evaluate() click to toggle source
# File lib/rulz/evaluator.rb, line 87
def evaluate
  instance_eval(&@proc)
end
where(condition, *args, &block) click to toggle source
# File lib/rulz/evaluator.rb, line 91
def where(condition, *args, &block)
  if condition.is_a? String
    @receiver.instance_eval(&block) if Rulz::Evaluator::Condition.new(@receiver, condition, *args).evaluate
  elsif condition.is_a? Proc
    @receiver.instance_eval(&block) if condition.call(*args)
  elsif condition.is_a? Array
    split_condition = condition.inject([[]]) do |results, element|
      if ["AND", "OR"].include? element
        results << {"AND" => "&&", "OR" => "||"}[element]
        results << []
      elsif element.is_a?(Hash)
        results.pop if results.last.respond_to?(:empty?) && results.last.empty? 
        results << element
      else
        results.last << element
      end
      results
    end
    split_condition.map! do |element|
      if element.is_a?(Array)
        Rulz::Evaluator::Condition.new(@receiver, *element).evaluate
      elsif element.is_a?(Hash)
        attribute, element = *element.first
        Rulz::Evaluator::AttributeCondition.new(@receiver, attribute, *element).evaluate
      else
        element
      end
    end
    @receiver.instance_eval(&block) if eval(split_condition.join(" "))
  elsif condition.is_a? Hash
    attribute, condition = *condition.first
    @receiver.instance_eval(&block) if Rulz::Evaluator::AttributeCondition.new(@receiver, attribute, *condition).evaluate
  else
    raise ArgumentError, "Invalid condition"
  end
end