Module: StatePattern
- Defined in:
- lib/state_pattern.rb,
lib/state_pattern/state.rb,
lib/state_pattern/invalid_transition_exception.rb
Defined Under Namespace
Modules: ClassMethods
Classes: InvalidTransitionException, State
Class Method Summary
collapse
Instance Method Summary
collapse
Class Method Details
.included(base) ⇒ Object
5
6
7
|
# File 'lib/state_pattern.rb', line 5
def self.included(base)
base.extend ClassMethods
end
|
Instance Method Details
#current_state_instance ⇒ Object
83
84
85
86
|
# File 'lib/state_pattern.rb', line 83
def current_state_instance
set_state if @current_state_instance.nil?
@current_state_instance
end
|
#delegate_to_state(state_method_name, *args, &block) ⇒ Object
88
89
90
91
|
# File 'lib/state_pattern.rb', line 88
def delegate_to_state(state_method_name, *args, &block)
@current_method = state_method_name.to_sym
self.current_state_instance.send(@current_method, *args, &block)
end
|
#raise_invalid_transition_to(state_class) ⇒ Object
99
100
101
|
# File 'lib/state_pattern.rb', line 99
def raise_invalid_transition_to(state_class)
raise InvalidTransitionException.new(current_state_instance.class, state_class, @current_method)
end
|
#set_state(state_class = nil) ⇒ Object
77
78
79
80
81
|
# File 'lib/state_pattern.rb', line 77
def set_state(state_class = nil)
state_class ||= self.class.initial_state_class
return @current_state_instance if @current_state_instance.class == state_class
@current_state_instance = state_class.new(self, @current_state_instance)
end
|
#transition_to(next_state_class) ⇒ Object
93
94
95
96
97
|
# File 'lib/state_pattern.rb', line 93
def transition_to(next_state_class)
raise_invalid_transition_to(next_state_class) unless valid_transition?(current_state_instance.class, next_state_class)
current_state_instance.exit
set_state(next_state_class)
end
|
#valid_transition?(from_state, to_state) ⇒ Boolean
103
104
105
106
107
108
109
|
# File 'lib/state_pattern.rb', line 103
def valid_transition?(from_state, to_state)
transitions = self.class.transitions_hash
return true if transitions.nil?
valid_transition_targets = transitions[from_state] || transitions[[from_state, @current_method]]
valid_transition_targets && valid_transition_targets.include?(to_state)
end
|