Class: StrategyBag
- Inherits:
-
Object
- Object
- StrategyBag
- Extended by:
- ClassDSL
- Defined in:
- lib/strategy_bag.rb,
lib/strategy_bag/version.rb
Defined Under Namespace
Modules: ClassDSL Classes: Evaluator, Strategy
Constant Summary collapse
- VERSION =
"0.1.0"
Instance Attribute Summary
Attributes included from ClassDSL
#conditions, #default_strategy, #derived_attributes, #param_names, #strategies
Instance Method Summary collapse
-
#initialize(*args) ⇒ StrategyBag
constructor
A new instance of StrategyBag.
- #run ⇒ Object
Methods included from ClassDSL
condition, default, derive, params, strategy
Constructor Details
#initialize(*args) ⇒ StrategyBag
Returns a new instance of StrategyBag.
3 4 5 6 7 8 9 10 11 12 13 |
# 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 |
Instance Method Details
#run ⇒ Object
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
# 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 |