module DataMapper::Is::StateMachine
Constants
- VERSION
Public Instance Methods
inherited(base)
click to toggle source
Calls superclass method
# File lib/dm-is-state_machine/is/state_machine.rb, line 71 def inherited(base) super base.class_eval do @is_state_machine = superclass.instance_variable_get(:@is_state_machine) end end
is_state_machine(options = {}) { || ... }
click to toggle source
Makes a column (‘state’ by default) act as a state machine. It will define the property if it does not exist.
@example [Usage]
is :state_machine is :state_machine, :initial => :internal is :state_machine, :column => :availability is :state_machine, :column => :availability, :initial => :external
@param options<Hash> a hash of options
@option :column<Symbol> the name of the custom column
# File lib/dm-is-state_machine/is/state_machine.rb, line 26 def is_state_machine(options = {}, &block) extend DataMapper::Is::StateMachine::EventDsl extend DataMapper::Is::StateMachine::StateDsl include DataMapper::Is::StateMachine::InstanceMethods # ===== Setup context ===== options = { :column => :state, :initial => nil }.merge(options) column = options[:column] initial = options[:initial].to_s unless properties.detect { |p| p.name == column } property column, String, :default => initial end machine = Data::Machine.new(column, initial) @is_state_machine = { :machine => machine } class_eval <<-RUBY, __FILE__, __LINE__ + 1 def #{column}=(value) value = value.to_s if value.kind_of?(Symbol) attribute_set(#{column.inspect}, value) end RUBY # ===== Define callbacks ===== # TODO: define callbacks # before :save do # if self.new_record? # # ... # else # # ... # end # end before :destroy do # Do we need to do anything here? end # ===== Setup context ===== push_state_machine_context(:is) yield if block_given? # ===== Teardown context ===== pop_state_machine_context end
Protected Instance Methods
pop_state_machine_context()
click to toggle source
# File lib/dm-is-state_machine/is/state_machine.rb, line 89 def pop_state_machine_context @is_state_machine[:context].pop end
push_state_machine_context(label)
click to toggle source
# File lib/dm-is-state_machine/is/state_machine.rb, line 80 def push_state_machine_context(label) @is_state_machine ||= {} @is_state_machine[:context] ||= [] @is_state_machine[:context] << label # Compacted, but barely readable for humans # ((@is_state_machine ||= {})[:context] ||= []) << label end
state_machine_context?(label)
click to toggle source
# File lib/dm-is-state_machine/is/state_machine.rb, line 93 def state_machine_context?(label) (i = @is_state_machine) && (c = i[:context]) && c.respond_to?(:include?) && c.include?(label) end