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