class PrettyStateMachine::Machine

Attributes

state[R]

Public Class Methods

initial_state() click to toggle source
# File lib/pretty_state_machine/machine.rb, line 14
def self.initial_state
  states.values.find(&:initial?)
end
new(state=self.class.initial_state) click to toggle source
# File lib/pretty_state_machine/machine.rb, line 43
def initialize(state=self.class.initial_state)
  raise InvalidMachine.new('an initial state is required') if state.nil?
  @state = State(state)
end
state(name, options={}) click to toggle source
# File lib/pretty_state_machine/machine.rb, line 18
def self.state(name, options={})
  initial = options.fetch(:initial) { false }
  state = State.new(name, initial: initial)
  states[name] = state
end
states() click to toggle source
# File lib/pretty_state_machine/machine.rb, line 6
def self.states
  @_states ||= {}
end
transition(name, &block) click to toggle source
# File lib/pretty_state_machine/machine.rb, line 24
def self.transition(name, &block)
  transition = Transition.new(self, name)
  transition.instance_eval(&block)

  if transition.to_state.nil?
    raise InvalidTransition, "transition '#{name}' requires an end state"
  end

  define_method(name) do
    if transition.permitted_from?(@state)
      @state = transition.to_state
    else
      raise InvalidTransition, "cannot transition to '#{transition.to_state}' via '#{name}' from '#{@state}'"
    end
  end

  transitions[name] = transition
end
transitions() click to toggle source
# File lib/pretty_state_machine/machine.rb, line 10
def self.transitions
  @_transitions ||= {}
end

Protected Class Methods

state_from_name(state_name) click to toggle source
# File lib/pretty_state_machine/machine.rb, line 50
def self.state_from_name(state_name)
  states.fetch(state_name) do
    raise InvalidState.new("'#{state_name}' is an invalid state")
  end
end

Protected Instance Methods

State(arg) click to toggle source
# File lib/pretty_state_machine/machine.rb, line 56
def State(arg)
  case arg
  when State then arg
  when Symbol then self.class.state_from_name(arg)
  else
    raise TypeError, "cannot convert #{arg.inspect} to State"
  end
end