Class: StrategyBag

Inherits:
Object
  • Object
show all
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

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

#runObject



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