module QueuedStateMachine

Public Class Methods

included(base) click to toggle source
# File lib/queued_state_machine.rb, line 5
def self.included(base)
  base.extend(ClassMethods)
end
new() click to toggle source
Calls superclass method
# File lib/queued_state_machine.rb, line 100
def initialize
  super
  @state = self.class.initial_state
  @pending_transitions = []
end

Public Instance Methods

at() click to toggle source
# File lib/queued_state_machine.rb, line 126
def at
  @state
end
at?(arg) click to toggle source
# File lib/queued_state_machine.rb, line 130
def at?(arg)
  list = self.class.clean_state_list(arg)
  raise if list == nil
  list.include?(@state)
end
quietly_to(state) click to toggle source
# File lib/queued_state_machine.rb, line 122
def quietly_to(state)
  to(state, quiet: true)
end
to(state, quiet: false) click to toggle source
# File lib/queued_state_machine.rb, line 106
def to(state, quiet: false)
  from = @state
  to = self.class.clean_state(state)
  @pending_transitions << {from: from, to: to, quiet: quiet}
  return if @pending_transitions.length > 1
  loop do
    next_transition = @pending_transitions.first
    break unless next_transition
    @state = next_transition[:to]
    unless next_transition[:quiet]
      process_transition(next_transition[:from], next_transition[:to])
    end
    @pending_transitions.shift
  end
end

Private Instance Methods

process_transition(from, to) click to toggle source
# File lib/queued_state_machine.rb, line 138
def process_transition(from, to)
  valid_transitions = self.class.transitions.select do |transition|
    transition[:from].include?(from) && transition[:to].include?(to)
  end
  if valid_transitions.empty?
    raise InvalidTransition, "Error: no valid transition from '#{from}' to '#{to}'"
  end
  valid_callbacks = self.class.callbacks.select do |transition|
    transition[:from].include?(from) && transition[:to].include?(to)
  end
  valid_callbacks.each { |callback| instance_eval(&callback[:callback]) }
end