Sha256: 36accea594a0618b79c288075f2499fa124348c9254a5379048dc832b01181d7

Contents?: true

Size: 1.2 KB

Versions: 1

Compression:

Stored size: 1.2 KB

Contents

module FSM
  class StateAttributeInterceptor
    def self.add_interceptor(klass)
      state_attribute_name = Machine[klass].current_state_attribute_name
      hierarchy = klass.ancestors.map {|ancestor| ancestor.to_s}
      
      if hierarchy.include?("ActiveRecord::Base")
        bar(klass)
      else 
        foo(klass)
      end
     
    end
    
    # TODO: find reasonable names for these methods... actualy find a better way to intercept those calls
    # looks really ugly to me
    private
    def self.bar(klass)
      klass.instance_eval() do
        define_method(Machine[klass].current_state_attribute_name) do
          value = read_attribute(Machine[self.class].current_state_attribute_name) || Machine[self.class].initial_state_name
          value.is_a?(String) ? value.intern : value
        end
      end
    end
    
    def self.foo(klass)
      klass.instance_eval() do 
        alias_method "fsm_state_attribute", Machine[klass].current_state_attribute_name
        define_method(Machine[klass].current_state_attribute_name) do
          value = fsm_state_attribute || Machine[self.class].initial_state_name
          value.is_a?(String) ? value.intern : value
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
simplificator-fsm-0.3.3 lib/fsm/state_attribute_interceptor.rb