Module: SimpleMachine::ClassMethods

Defined in:
lib/simple_machine.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.get_state_machine_class_for(cls, state_field_name) ⇒ Object



114
115
116
117
118
119
120
121
122
# File 'lib/simple_machine.rb', line 114

def self.get_state_machine_class_for(cls, state_field_name)
  key = [cls.to_s.to_sym, state_field_name]
  unless @state_machine_classes.has_key? key
    @state_machine_classes[key] ||= SimpleMachine::SimpleMachinePrototype.clone
    @state_machine_classes[key].owner_class = cls
    @state_machine_classes[key].parents_state_field_name = state_field_name
  end
  @state_machine_classes[key]
end

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).instance_eval &block
  
  raise "Initial state not defined." unless send default_state_field_name
end