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