Class: DataMapper::Is::StateMachine::Data::Machine

### Home Classes Methods

### In Files

- lib/dm-is-state_machine/is/data/machine.rb

### Parent

Object

### Methods

- ::new
- #current_state
- #find_event
- #find_state
- #fire_event

### Files

- LICENSE
- README.rdoc

### Class/Module Index

Quicksearch

- DataMapper
- DataMapper::Is
- DataMapper::Is::StateMachine
- DataMapper::Is::StateMachine::Data
- DataMapper::Is::StateMachine::Data::Event
- DataMapper::Is::StateMachine::Data::Machine
- DataMapper::Is::StateMachine::Data::State
- DataMapper::Is::StateMachine::DuplicateStates
- DataMapper::Is::StateMachine::EventConfusion
- DataMapper::Is::StateMachine::EventDsl
- DataMapper::Is::StateMachine::InstanceMethods
- DataMapper::Is::StateMachine::InvalidContext
- DataMapper::Is::StateMachine::InvalidEvent
- DataMapper::Is::StateMachine::InvalidState
- DataMapper::Is::StateMachine::NoInitialState
- DataMapper::Is::StateMachine::StateDsl

No matching classes.

# DataMapper::Is::StateMachine::Data::Machine

This Machine class represents one state machine.

A model (i.e. a DataMapper resource) can have more than one Machine.

### Attributes

column[RW]

The property of the DM resource that will hold this Machine's state.

TODO: change :column to :property

current_state_name[RW]

The current value of this Machine's state

This is the "primary control" of this Machine's state. All other methods key off the value of @current_state_name.

events[RW]
initial[RW]

The initial value of this Machine's state

states[RW]

### Public Class Methods

new(column, initial) click to toggle source

    # File lib/dm-is-state_machine/is/data/machine.rb, line 30
    def initialize(column, initial)
      @column, @initial   = column, initial
      @events, @states    = [], []
      @current_state_name = initial
    end

### Public Instance Methods

current_state() click to toggle source

Return the current state

@api public

    # File lib/dm-is-state_machine/is/data/machine.rb, line 64
    def current_state
      find_state(@current_state_name)
      # TODO: add caching, i.e. with `@current_state ||= ...`
    end

find_event(event_name) click to toggle source

Find event whose name is `event_name`

@api semipublic

    # File lib/dm-is-state_machine/is/data/machine.rb, line 72
    def find_event(event_name)
      @events.find { |event| event.name.to_s == event_name.to_s }
      # TODO: use a data structure that prevents duplicates
    end

find_state(state_name) click to toggle source

Find state whose name is `event_name`

@api semipublic

    # File lib/dm-is-state_machine/is/data/machine.rb, line 80
    def find_state(state_name)
      @states.find { |state| state.name.to_s == state_name.to_s }
      # TODO: use a data structure that prevents duplicates
    end

fire_event(event_name, resource) click to toggle source

Fire (activate) the event with name `event_name`

@api public

    # File lib/dm-is-state_machine/is/data/machine.rb, line 39
    def fire_event(event_name, resource)
      unless event = find_event(event_name)
        raise InvalidEvent, "Could not find event (#{event_name.inspect})"
      end
      transition = event.transitions.find do |t|
         t[:from].to_s == @current_state_name.to_s
      end
      unless transition
        raise InvalidEvent, "Event (#{event_name.inspect}) does not" +
        "exist for current state (#{@current_state_name.inspect})"
      end

      # == Run :exit hook (if present) ==
      resource.run_hook_if_present current_state.options[:exit]

      # == Change the current_state ==
      @current_state_name = transition[:to]

      # == Run :enter hook (if present) ==
      resource.run_hook_if_present current_state.options[:enter]
    end

[Validate]

Generated with the Darkfish Rdoc Generator 2.