class SimpleState::Machine

Public Class Methods

new(object, state_attribute = :state, definition = nil, &block) click to toggle source
# File lib/simple_state/machine.rb, line 3
def initialize(object, state_attribute = :state, definition = nil, &block)
  @object          = object
  @state_attribute = state_attribute
  @definition      = definition || SimpleState::Definition.define(&block)

  define_trasition_methods
end

Private Instance Methods

define_transition_method(name, from:, to:) click to toggle source
# File lib/simple_state/machine.rb, line 21
def define_transition_method(name, from:, to:)
  define_singleton_method(:"can_#{name}?") do
    current_state = @object.public_send(@state_attribute)
    from.include?(current_state.to_sym)
  end

  define_singleton_method(:"#{name}!") do
    unless public_send(:"can_#{name}?")
      raise TransitionError, "Unable to transition from #{@object.public_send(@state_attribute)} to #{to}"
    end

    @object.public_send(:"#{@state_attribute}=", to)
  end
end
define_trasition_methods() click to toggle source
# File lib/simple_state/machine.rb, line 17
def define_trasition_methods
  transitions.each { |name, options| define_transition_method(name, options) }
end
transitions() click to toggle source
# File lib/simple_state/machine.rb, line 13
def transitions
  @definition[:transitions]
end