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 |