Class StateMachine::Path
In: lib/state_machine/path.rb
Parent: Array

A path represents a sequence of transitions that can be run for a particular object. Paths can walk to new transitions, revealing all of the possible branches that can be encountered in the object‘s state machine.

Methods

complete?   events   from_name   from_states   new   to_name   to_states   walk  

Included Modules

Assertions

Attributes

machine  [R]  The state machine this path is walking
object  [R]  The object whose state machine is being walked

Public Class methods

Creates a new transition path for the given object. Initially this is an empty path. In order to start walking the path, it must be populated with an initial transition.

Configuration options:

  • :target - The target state to end the path on
  • :guard - Whether to guard transitions with the if/unless conditionals defined for each one

[Source]

    # File lib/state_machine/path.rb, line 22
22:     def initialize(object, machine, options = {})
23:       assert_valid_keys(options, :target, :guard)
24:       
25:       @object = object
26:       @machine = machine
27:       @target = options[:target]
28:       @guard = options[:guard]
29:     end

Public Instance methods

Determines whether or not this path has completed. A path is considered complete when one of the following conditions is met:

  • The last transition in the path ends on the target state
  • There are no more transitions remaining to walk and there is no target state

[Source]

    # File lib/state_machine/path.rb, line 85
85:     def complete?
86:       !empty? && (@target ? to_name == @target : transitions.empty?)
87:     end

Lists all of the events that can be fired through this path.

For example,

  path.events # => [:park, :ignite, :shift_up, ...]

[Source]

    # File lib/state_machine/path.rb, line 70
70:     def events
71:       map {|transition| transition.event}.uniq
72:     end

The initial state name for this path

[Source]

    # File lib/state_machine/path.rb, line 37
37:     def from_name
38:       first && first.from_name
39:     end

Lists all of the from states that can be reached through this path.

For example,

  path.to_states  # => [:parked, :idling, :first_gear, ...]

[Source]

    # File lib/state_machine/path.rb, line 46
46:     def from_states
47:       map {|transition| transition.from_name}.uniq
48:     end

The end state name for this path. If a target state was specified for the path, then that will be returned if the path is complete.

[Source]

    # File lib/state_machine/path.rb, line 52
52:     def to_name
53:       last && last.to_name
54:     end

Lists all of the to states that can be reached through this path.

For example,

  path.to_states  # => [:parked, :idling, :first_gear, ...]

[Source]

    # File lib/state_machine/path.rb, line 61
61:     def to_states
62:       map {|transition| transition.to_name}.uniq
63:     end

Walks down the next transitions at the end of this path. This will only walk down paths that are considered valid.

[Source]

    # File lib/state_machine/path.rb, line 76
76:     def walk
77:       transitions.each {|transition| yield dup.push(transition)}
78:     end

[Validate]