class StrategyBag

Constants

VERSION

Public Class Methods

new(*args) click to toggle source
# File lib/strategy_bag.rb, line 3
def initialize(*args)
  interface, *param_values = args
  if param_values.size != self.class.param_names.size
    raise ArgumentError, "expected params: interface, #{self.class.param_names.map(&:to_s).join(', ')}, but only #{args.size} params given"
  end
  @evaluator = Evaluator.new
  @evaluator.interface = interface
  self.class.param_names.each_with_index do |name, index|
    @evaluator.define_value name, param_values[index]
  end
end

Public Instance Methods

run() click to toggle source
# File lib/strategy_bag.rb, line 15
def run
  self.class.derived_attributes.each do |name, block|
    @evaluator.define_func name, block
  end
  self.class.conditions.each do |positive_name, negative_name, p|
    @evaluator.define_func positive_name, p
    @evaluator.define_negative negative_name, positive_name
  end
  satisfied_strategies = self.class.strategies.select { |strategy|
    @evaluator.conditions_met?(strategy.conditions)
  }
  selected_strategy = satisfied_strategies.first
  if selected_strategy
    @evaluator.instance_eval(&selected_strategy.action)
  else
    @evaluator.instance_eval(&(self.class.default_strategy))
  end
end