Module: SimpleMachine::ClassMethods

Defined in:
lib/simple_machine.rb

Instance Method Summary collapse

Instance Method Details

#implement_state_machine_for(state_field_name, &block) ⇒ Object



85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# File 'lib/simple_machine.rb', line 85

def implement_state_machine_for(state_field_name, &block)
  machine_property_name = "#{state_field_name}_machine".to_sym
  default_state_field_name = "#{state_field_name}_default_state".to_sym

  define_method state_field_name do
    result = instance_variable_get "@#{state_field_name}"
    result = instance_variable_set "@#{state_field_name}", self.class.send(default_state_field_name) unless result
    result
  end
  define_method machine_property_name do
    result = instance_variable_get "@#{machine_property_name}"
    result = instance_variable_set "@#{machine_property_name}", SimpleMachine::ClassMethods.get_state_machine_class_for(self.class, state_field_name).new(self) unless result
    result
  end
  self.class.class_eval do
    define_method default_state_field_name do
      instance_variable_get "@#{default_state_field_name}"
    end
  end
  
  SimpleMachine::ClassMethods.get_state_machine_class_for(self, state_field_name, true).instance_eval &block
  
  raise "Initial state not defined." unless send default_state_field_name
end