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