module Transitionable

Constants

VERSION

Public Instance Methods

validate_transition(target_state:) { |invalid_state_transition| ... } click to toggle source
# File lib/transitionable.rb, line 43
def validate_transition(target_state:)
  self.class.state_machines.each do |machine_name, machine|
    next unless machine[:states].include?(target_state)
    current_state = send(machine_name)
    matched_transition = machine[:transitions].detect do |transition|
      transition[:from] == current_state && transition[:to] == target_state
    end
    return true if matched_transition.present?
    yield(InvalidStateTransition.new(current_state, target_state)) if block_given?
    return false
  end
  # raise error if can't find the provided target state
  raise InvalidStateTransition.new(nil, target_state)
end
validate_transition!(target_state:) click to toggle source
# File lib/transitionable.rb, line 35
def validate_transition!(target_state:)
  current_state = current_state_based_on(target_state)
  unless validate_transition(target_state: target_state)
    raise InvalidStateTransition.new(current_state, target_state)
  end
  true
end

Private Instance Methods

current_state_based_on(target_state) click to toggle source
# File lib/transitionable.rb, line 60
def current_state_based_on(target_state)
  self.class.state_machines.each do |machine_name, machine|
    return send(machine_name) if machine[:states].include?(target_state)
  end
  raise InvalidStateTransition.new(nil, target_state)
end