class EndState::StateMachine

Attributes

failure_messages[RW]
success_messages[RW]

Public Class Methods

new(object) click to toggle source
Calls superclass method
# File lib/end_state/state_machine.rb, line 7
def initialize(object)
  super
  Action.new(self, self.class.initial_state).call if state.nil?
end

Public Instance Methods

can_transition?(end_state, params = {}) click to toggle source
# File lib/end_state/state_machine.rb, line 16
def can_transition?(end_state, params = {})
  return false unless __sm_transition_configuration_for(state.to_sym, end_state.to_sym)
  __sm_transition_for(end_state.to_sym).will_allow?(params)
end
method_missing(method, *args, &block) click to toggle source
Calls superclass method
# File lib/end_state/state_machine.rb, line 31
def method_missing(method, *args, &block)
  return super unless __sm_is_method?(method)
  return __sm_predicate(method) if __sm_is_state_predicate?(method)
  __sm_event_transition __sm_event(method), args[0] || {}, __sm_event_mode(method)
end
object() click to toggle source
# File lib/end_state/state_machine.rb, line 12
def object
  __getobj__
end
transition(end_state, params = {}, mode = self.class.mode) click to toggle source
# File lib/end_state/state_machine.rb, line 21
def transition(end_state, params = {}, mode = self.class.mode)
  __sm_reset_messages
  return __sm_block_transistion(end_state.to_sym, mode) unless __sm_transition_configuration_for(state.to_sym, end_state.to_sym)
  __sm_transition_for(end_state.to_sym, mode).call(params)
end
transition!(end_state, params = {}) click to toggle source
# File lib/end_state/state_machine.rb, line 27
def transition!(end_state, params = {})
  transition end_state.to_sym, params, :hard
end

Private Instance Methods

__sm_actual_mode(mode) click to toggle source
# File lib/end_state/state_machine.rb, line 78
def __sm_actual_mode(mode)
  return :hard if self.class.mode == :hard
  mode
end
__sm_block_transistion(state, mode) click to toggle source
# File lib/end_state/state_machine.rb, line 104
def __sm_block_transistion(state, mode)
  if self.class.end_states.include? state
    Kernel.fail InvalidTransition, "The transition: #{object.state} => #{state} is invalid." if mode == :hard
    return false
  end
  Kernel.fail UnknownState, "The state: #{state} is unknown."
end
__sm_current_state?(end_state) click to toggle source
# File lib/end_state/state_machine.rb, line 68
def __sm_current_state?(end_state)
  state.to_sym == end_state
end
__sm_event(method) click to toggle source
# File lib/end_state/state_machine.rb, line 51
def __sm_event(method)
  method.to_s.gsub('!','').to_sym
end
__sm_event_mode(method) click to toggle source
# File lib/end_state/state_machine.rb, line 55
def __sm_event_mode(method)
  return :hard if method.to_s.end_with?('!')
  __sm_actual_mode(:soft)
end
__sm_event_transition(event, params, mode) click to toggle source
# File lib/end_state/state_machine.rb, line 72
def __sm_event_transition(event, params, mode)
  end_state = __sm_state_for_event(event, mode)
  return false if end_state == :__invalid_event__
  transition end_state, params, mode
end
__sm_extract_state(method) click to toggle source
# File lib/end_state/state_machine.rb, line 47
def __sm_extract_state(method)
  method.to_s[0..-2].to_sym
end
__sm_invalid_event(event, mode) click to toggle source
# File lib/end_state/state_machine.rb, line 87
def __sm_invalid_event(event, mode)
  Kernel.fail InvalidTransition, "Transition by event: #{event} is invalid." if mode == :hard
  :__invalid_event__
end
__sm_is_event?(method) click to toggle source
# File lib/end_state/state_machine.rb, line 64
def __sm_is_event?(method)
  self.class.events.include? __sm_event(method)
end
__sm_is_method?(method) click to toggle source
# File lib/end_state/state_machine.rb, line 39
def __sm_is_method?(method)
  __sm_is_state_predicate?(method) || __sm_is_event?(method)
end
__sm_is_state_predicate?(method) click to toggle source
# File lib/end_state/state_machine.rb, line 60
def __sm_is_state_predicate?(method)
  method.to_s.end_with?('?') && self.class.states.include?(__sm_extract_state(method))
end
__sm_predicate(method) click to toggle source
# File lib/end_state/state_machine.rb, line 43
def __sm_predicate(method)
  __sm_current_state? __sm_extract_state(method)
end
__sm_reset_messages() click to toggle source
# File lib/end_state/state_machine.rb, line 112
def __sm_reset_messages
  @failure_messages = []
  @success_messages = []
end
__sm_state_for_event(event, mode) click to toggle source
# File lib/end_state/state_machine.rb, line 83
def __sm_state_for_event(event, mode)
  self.class.transition_configurations.get_end_state(state.to_sym, event) || __sm_invalid_event(event, mode)
end
__sm_transition_configuration_for(start_state, end_state) click to toggle source
# File lib/end_state/state_machine.rb, line 92
def __sm_transition_configuration_for(start_state, end_state)
  self.class.transition_configurations.get_configuration(start_state, end_state)
end
__sm_transition_for(end_state, mode = self.class.mode) click to toggle source
# File lib/end_state/state_machine.rb, line 96
def __sm_transition_for(end_state, mode = self.class.mode)
  start_state = state.to_sym
  end_state = end_state.to_sym
  configuration = __sm_transition_configuration_for(start_state, end_state)
  mode = __sm_actual_mode(mode)
  Transition.new(self, start_state, end_state, configuration, mode)
end