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