class StateDesignPattern::StateMachine

Attributes

context[R]

Public Class Methods

new() click to toggle source
# File lib/state_design_pattern/state_machine.rb, line 12
def initialize
  initialize_context
  transition_to_start_state
  setup_delegation
end

Public Instance Methods

current_state() click to toggle source
# File lib/state_design_pattern/state_machine.rb, line 25
def current_state
  @state.class
end
initial_context() click to toggle source
# File lib/state_design_pattern/state_machine.rb, line 18
def initial_context
end
send_event(name, message = {}) click to toggle source
# File lib/state_design_pattern/state_machine.rb, line 38
def send_event(name, message = {})
  event = { name: name, source: self }.merge(message)

  changed
  notify_observers(event)

  self
end
start_state() click to toggle source
# File lib/state_design_pattern/state_machine.rb, line 21
def start_state
  raise NotImplementedError
end
transition_to_state(state_class) click to toggle source
# File lib/state_design_pattern/state_machine.rb, line 34
def transition_to_state(state_class)
  @state = state_class.new(self)
end
transition_to_state_and_send_event(state_class, name, message = {}) click to toggle source
# File lib/state_design_pattern/state_machine.rb, line 29
def transition_to_state_and_send_event(state_class, name, message = {})
  transition_to_state(state_class)
  send_event(name, message)
end

Private Instance Methods

initialize_context() click to toggle source
# File lib/state_design_pattern/state_machine.rb, line 49
def initialize_context
  @context = initial_context
end
setup_action_delegation() click to toggle source
# File lib/state_design_pattern/state_machine.rb, line 69
def setup_action_delegation
  if @state.respond_to?(:actions)
    methods = @state.actions
    self.class.def_delegators :@state, *methods
  end
end
setup_context_delegation() click to toggle source
# File lib/state_design_pattern/state_machine.rb, line 62
def setup_context_delegation
  if @context
    methods = @context.members.map { |reader| [reader, "#{reader}=".to_sym] }.flatten
    self.class.def_delegators :@context, *methods
  end
end
setup_delegation() click to toggle source
# File lib/state_design_pattern/state_machine.rb, line 57
def setup_delegation
  setup_context_delegation
  setup_action_delegation
end
transition_to_start_state() click to toggle source
# File lib/state_design_pattern/state_machine.rb, line 53
def transition_to_start_state
  transition_to_state(start_state)
end