spoonsix-ssm 0.1.4 → 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/ssm.rb +21 -8
- metadata +1 -1
data/lib/ssm.rb
CHANGED
@@ -40,7 +40,7 @@ require File.join(File.dirname(__FILE__), 'state_machine')
|
|
40
40
|
#--
|
41
41
|
module SSM
|
42
42
|
|
43
|
-
VERSION = '0.1.
|
43
|
+
VERSION = '0.1.5';
|
44
44
|
|
45
45
|
class InvalidTransition < RuntimeError; end
|
46
46
|
class UndefinedState < RuntimeError; end
|
@@ -91,9 +91,7 @@ module SSM
|
|
91
91
|
instance.instance_eval("def #{sm.property_name}; @#{sm.property_name}; end") unless instance.respond_to?(sm.property_name)
|
92
92
|
instance.instance_eval("def #{sm.property_name}=(v); @#{sm.property_name} = v; end") unless instance.respond_to?("#{sm.property_name}=".to_sym)
|
93
93
|
|
94
|
-
|
95
|
-
initial_state_value = sm.use_property_index == true ? sm.get_state_index_by_name(sm.initial_state.name) : sm.initial_state.name
|
96
|
-
instance.instance_variable_set("@#{sm.property_name}".to_sym, initial_state_value)
|
94
|
+
instance.send(:_synchronize_state)
|
97
95
|
end
|
98
96
|
end
|
99
97
|
|
@@ -215,7 +213,7 @@ module SSM
|
|
215
213
|
|
216
214
|
# Create StateMachine and create method associated with this StateTransition
|
217
215
|
SSM::TemplateStateMachines[self] << SSM::Event.new(name, SSM::StateTransition.new(from, to), &block)
|
218
|
-
define_method("#{name.to_s}") { |*args|
|
216
|
+
define_method("#{name.to_s}") { |*args| _synchronize_state; _ssm_trigger_event(name, args) }
|
219
217
|
end
|
220
218
|
|
221
219
|
def template_state_machine #:nodoc:
|
@@ -261,7 +259,7 @@ module SSM
|
|
261
259
|
# door.open
|
262
260
|
# door.is?(:opened) #=> true
|
263
261
|
def is?(state_name_or_symbol)
|
264
|
-
|
262
|
+
_synchronize_state
|
265
263
|
@ssm_state_machine.current_state.name.to_sym == state_name_or_symbol.to_sym
|
266
264
|
end
|
267
265
|
|
@@ -287,13 +285,14 @@ module SSM
|
|
287
285
|
# door.open
|
288
286
|
# door.is?(:closed) #=> false
|
289
287
|
def is_not?(state_name_or_symbol)
|
290
|
-
|
288
|
+
_synchronize_state
|
291
289
|
@ssm_state_machine.current_state.name.to_sym != state_name_or_symbol.to_sym
|
292
290
|
end
|
293
291
|
|
294
292
|
private
|
295
293
|
|
296
294
|
def _ssm_trigger_event(event_name_or_symbol, args)
|
295
|
+
_synchronize_state
|
297
296
|
event = @ssm_state_machine.get_event_by_name(event_name_or_symbol)
|
298
297
|
|
299
298
|
@ssm_state_machine.transition(event.transition)
|
@@ -329,6 +328,20 @@ module SSM
|
|
329
328
|
end
|
330
329
|
end
|
331
330
|
|
331
|
+
|
332
|
+
def _synchronize_state
|
333
|
+
|
334
|
+
if instance_variable_get("@#{@ssm_state_machine.property_name}".to_sym).nil?
|
335
|
+
state_value = @ssm_state_machine.use_property_index == true ?
|
336
|
+
@ssm_state_machine.get_state_index_by_name(@ssm_state_machine.current_state.name) :
|
337
|
+
@ssm_state_machine.current_state.name
|
338
|
+
send("#{@ssm_state_machine.property_name}=".to_sym, state_value)
|
339
|
+
else
|
340
|
+
_update_ssm_state unless _state_up_to_date?
|
341
|
+
end
|
342
|
+
true
|
343
|
+
end
|
344
|
+
|
332
345
|
# Checks whether the StateMachine and the property in the instance are in sync
|
333
346
|
def _state_up_to_date?
|
334
347
|
unless @ssm_state_machine.property_name.nil?
|
@@ -346,7 +359,7 @@ module SSM
|
|
346
359
|
# Updates the StateMachine based on the value of the state property of the instance
|
347
360
|
def _update_ssm_state
|
348
361
|
unless @ssm_state_machine.property_name.nil?
|
349
|
-
state_value =
|
362
|
+
state_value = send("#{@ssm_state_machine.property_name}".to_sym)
|
350
363
|
@ssm_state_machine.current_state = @ssm_state_machine.use_property_index == true ? @ssm_state_machine.get_state_by_index(state_value) : @ssm_state_machine.get_state_by_name(state_value)
|
351
364
|
end
|
352
365
|
end
|