class MicroMachine
Constants
- InvalidEvent
- InvalidState
Attributes
state[R]
transitions_for[R]
Public Class Methods
new(initial_state)
click to toggle source
# File lib/micromachine.rb, line 8 def initialize(initial_state) @state = initial_state @transitions_for = Hash.new @callbacks = Hash.new { |hash, key| hash[key] = [] } end
Public Instance Methods
events()
click to toggle source
# File lib/micromachine.rb, line 36 def events transitions_for.keys end
on(key, &block)
click to toggle source
# File lib/micromachine.rb, line 14 def on(key, &block) @callbacks[key] << block end
states()
click to toggle source
# File lib/micromachine.rb, line 44 def states transitions_for.values.map(&:to_a).flatten.uniq end
trigger(event, payload = nil)
click to toggle source
# File lib/micromachine.rb, line 22 def trigger(event, payload = nil) trigger?(event) and change(event, payload) end
trigger!(event, payload = nil)
click to toggle source
# File lib/micromachine.rb, line 26 def trigger!(event, payload = nil) trigger(event, payload) or raise InvalidState.new("Event '#{event}' not valid from state '#{@state}'") end
trigger?(event)
click to toggle source
# File lib/micromachine.rb, line 31 def trigger?(event) raise InvalidEvent unless transitions_for.has_key?(event) transitions_for[event].has_key?(state) end
triggerable_events()
click to toggle source
# File lib/micromachine.rb, line 40 def triggerable_events events.select { |event| trigger?(event) } end
when(event, transitions)
click to toggle source
# File lib/micromachine.rb, line 18 def when(event, transitions) transitions_for[event] = transitions end
Private Instance Methods
change(event, payload = nil)
click to toggle source
# File lib/micromachine.rb, line 50 def change(event, payload = nil) @state = transitions_for[event][@state] callbacks = @callbacks[@state] + @callbacks[:any] callbacks.each { |callback| callback.call(event, payload) } true end