mirror of
https://github.com/aasm/aasm
synced 2023-03-27 23:22:41 -04:00
49 lines
1.2 KiB
Ruby
49 lines
1.2 KiB
Ruby
module AASM
|
|
class Transition
|
|
attr_reader :from, :to, :opts
|
|
alias_method :options, :opts
|
|
|
|
def initialize(opts)
|
|
@from, @to, @guard, @on_transition = opts[:from], opts[:to], opts[:guard], opts[:on_transition]
|
|
@opts = opts
|
|
end
|
|
|
|
# TODO: should be named allowed? or similar
|
|
def perform(obj, *args)
|
|
case @guard
|
|
when Symbol, String
|
|
obj.send(@guard, *args)
|
|
when Proc
|
|
@guard.call(obj, *args)
|
|
else
|
|
true
|
|
end
|
|
end
|
|
|
|
def execute(obj, *args)
|
|
@on_transition.is_a?(Array) ?
|
|
@on_transition.each {|ot| _execute(obj, ot, *args)} :
|
|
_execute(obj, @on_transition, *args)
|
|
end
|
|
|
|
def ==(obj)
|
|
@from == obj.from && @to == obj.to
|
|
end
|
|
|
|
def from?(value)
|
|
@from == value
|
|
end
|
|
|
|
private
|
|
|
|
def _execute(obj, on_transition, *args)
|
|
case on_transition
|
|
when Proc
|
|
on_transition.arity == 0 ? on_transition.call : on_transition.call(obj, *args)
|
|
when Symbol, String
|
|
obj.send(:method, on_transition.to_sym).arity == 0 ? obj.send(on_transition) : obj.send(on_transition, *args)
|
|
end
|
|
end
|
|
|
|
end
|
|
end # AASM
|