Sha256: 1579bdb7bbaa9d0a61ddc3e4cf0802d6d1d888a99f6b3b0491f594bc10744937

Contents?: true

Size: 1.78 KB

Versions: 2

Compression:

Stored size: 1.78 KB

Contents

module Stateflow
  def self.included(base)
    base.send :include, InstanceMethods
    base.extend ClassMethods
    Stateflow::Persistence.set(base)
  end
  
  def self.persistence
    @@persistence ||= :active_record
  end
  
  def self.persistence=(persistence)
    @@persistence = persistence
  end
  
  module ClassMethods
    attr_reader :machine
    
    def stateflow(&block)
      @machine = Stateflow::Machine.new(&block)
      
      @machine.states.values.each do |state|
        state_name = state.name
        define_method "#{state_name}?" do
          state_name == current_state.name
        end
      end
      
      @machine.events.keys.each do |key|
        define_method "#{key}" do
          fire_event(key, :save => false)
        end
        
        define_method "#{key}!" do
          fire_event(key, :save => true)
        end
      end
    end
  end
  
  module InstanceMethods
    attr_accessor :_previous_state
    
    def current_state  
      @current_state ||= load_from_persistence.nil? ? machine.initial_state : machine.states[load_from_persistence.to_sym]
    end
    
    def set_current_state(new_state, options)
      save_to_persistence(new_state.name.to_s, options)
      @current_state = new_state
    end
    
    def machine
      self.class.machine
    end
    
    private
    def fire_event(event_name, options = {})
      event = machine.events[event_name.to_sym]
      raise Stateflow::NoEventFound.new("No event matches #{event_name}") if event.nil?
      event.fire(current_state, self, options)
    end
  end
  
  autoload :Machine, 'stateflow/machine'
  autoload :State, 'stateflow/state'
  autoload :Event, 'stateflow/event'
  autoload :Transition, 'stateflow/transition'
  autoload :Persistence, 'stateflow/persistence'
  autoload :Exception, 'stateflow/exception'
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
stateflow-0.4.0 lib/stateflow.rb
stateflow-0.3.0 lib/stateflow.rb