lib/minimus.rb in minimus-0.1.0 vs lib/minimus.rb in minimus-0.1.1
- old
+ new
@@ -2,17 +2,18 @@
class Minimus
TransitionError = Class.new(StandardError)
- attr_reader :states, :initial_state
+ attr_reader :states, :initial_state, :possibilities
attr_accessor :current_state
def initialize(*states)
@states = states
@initial_state = states.first
@current_state = initial_state
+ @possibilities = {}
end
def move(new_state)
return false unless move_possible?(new_state)
self.current_state = new_state
@@ -20,19 +21,30 @@
yield if block_given?
end
def move!(new_state)
unless move_possible?(new_state)
- raise TransitionError, %Q{unallowed transition from
- #{current_state} to #{new_state}}
+ raise TransitionError, %(unallowed transition from
+ #{current_state} to #{new_state})
end
self.current_state = new_state
yield if block_given?
end
+ def can(state, possible:)
+ possible_array = Array(possible)
+ return unless possible_array.all? { |value| states.include?(value) }
+
+ possibilities[state] = possible_array
+ end
+
private
def move_possible?(new_state)
- states[states.index(current_state) + 1] == new_state
+ if state_possibilities = possibilities[current_state]
+ state_possibilities.include?(new_state)
+ else
+ states[states.index(current_state) + 1] == new_state
+ end
end
end