aboutsummaryrefslogtreecommitdiffstats
path: root/activemodel/lib/active_model/state_machine/state_transition.rb
diff options
context:
space:
mode:
Diffstat (limited to 'activemodel/lib/active_model/state_machine/state_transition.rb')
-rw-r--r--activemodel/lib/active_model/state_machine/state_transition.rb40
1 files changed, 40 insertions, 0 deletions
diff --git a/activemodel/lib/active_model/state_machine/state_transition.rb b/activemodel/lib/active_model/state_machine/state_transition.rb
new file mode 100644
index 0000000000..f9df998ea4
--- /dev/null
+++ b/activemodel/lib/active_model/state_machine/state_transition.rb
@@ -0,0 +1,40 @@
+module ActiveModel
+ module StateMachine
+ class StateTransition
+ attr_reader :from, :to, :options
+
+ def initialize(opts)
+ @from, @to, @guard, @on_transition = opts[:from], opts[:to], opts[:guard], opts[:on_transition]
+ @options = opts
+ end
+
+ def perform(obj)
+ case @guard
+ when Symbol, String
+ obj.send(@guard)
+ when Proc
+ @guard.call(obj)
+ else
+ true
+ end
+ end
+
+ def execute(obj, *args)
+ case @on_transition
+ when Symbol, String
+ obj.send(@on_transition, *args)
+ when Proc
+ @on_transition.call(obj, *args)
+ end
+ end
+
+ def ==(obj)
+ @from == obj.from && @to == obj.to
+ end
+
+ def from?(value)
+ @from == value
+ end
+ end
+ end
+end