module Machiner::Transitions::SingletonMethods
Public Class Methods
extended(base)
click to toggle source
# File lib/machiner/transitions.rb, line 31 def self.extended(base) return unless base.ancestors.include?(InstanceMethods) base_container = base.ancestors[1..].detect { |i| i.respond_to? :transition_container }&.transition_container return unless base_container return if base.transition_container.supercontainers.include?(base_container) base.transition_container.supercontainers << base_container end
Public Instance Methods
call(event_name, *data, **meta)
click to toggle source
# File lib/machiner/transitions.rb, line 65 def call(event_name, *data, **meta) raise ArgumentError if data.empty? transition_keys = transition_container.filtered_keys(event_name, **meta) raise WrongTransitionError if transition_keys.empty? transition_key = transition_keys.detect do |key| transition_key_check(key, *data) end raise WrongStateError unless transition_key call_transition_by_full_key(transition_key, *data) end
included(base)
click to toggle source
Calls superclass method
# File lib/machiner/transitions.rb, line 21 def included(base) super base.extend SingletonMethods end
inherited(base)
click to toggle source
Calls superclass method
# File lib/machiner/transitions.rb, line 26 def inherited(base) super base.extend SingletonMethods end
meta(**meta_hash)
click to toggle source
# File lib/machiner/transitions.rb, line 17 def meta(**meta_hash) @meta = meta_hash || {} end
safe_call(event_name, *data, **meta)
click to toggle source
# File lib/machiner/transitions.rb, line 79 def safe_call(event_name, *data, **meta) transition_keys = transition_container.filtered_keys(event_name, **meta) return (data.size == 1 ? data[0] : data) if transition_keys.empty? transition_key = transition_keys.detect do |key| transition_key_check(key, *data) end return (data.size == 1 ? data[0] : data) unless transition_key call_transition_by_full_key(transition_key, *data) end
transition(event_name, path, meta = {}, &block)
click to toggle source
# File lib/machiner/transitions.rb, line 42 def transition(event_name, path, meta = {}, &block) meta = @meta.merge(meta) if @meta from_state = path.keys.first to_state = path.values.first meta.merge!(from: from_state, to: to_state) transition_container.register(event_name, **meta, &block) end
transition?(event_name, *data, **meta)
click to toggle source
# File lib/machiner/transitions.rb, line 54 def transition?(event_name, *data, **meta) transition_keys = transition_container.filtered_keys(event_name, **meta) transition_keys.any? do |key| transition_key_check(key, *data) end end
transition_container()
click to toggle source
# File lib/machiner/transitions.rb, line 13 def transition_container @transition_container ||= Container.new end
transition_names()
click to toggle source
# File lib/machiner/transitions.rb, line 50 def transition_names transition_container.keys.uniq end
transitions(*data, **meta)
click to toggle source
# File lib/machiner/transitions.rb, line 61 def transitions(*data, **meta) transition_container.full_keys.select { |key| transition_key_check(key, *data, **meta) } end
Private Instance Methods
call_transition_by_full_key(transition_key, *data)
click to toggle source
# File lib/machiner/transitions.rb, line 93 def call_transition_by_full_key(transition_key, *data) transition = transition_container.get_by_full_key(transition_key) if transition.arity > data.size transition.call(*data.map(&:clone), self) else transition.call(*data.map(&:clone)) end end
transition_key_check(key, *data)
click to toggle source
# File lib/machiner/transitions.rb, line 102 def transition_key_check(key, *data) meta = key.last.except(:from, :to) [key.last[:from]].flatten.all? { |state| state?(state, *data, **meta) } end