Sha256: 0e87b94bf5b2d298c03a415c497c701475c146a27a0bea859e9d49e74862e589

Contents?: true

Size: 1.3 KB

Versions: 1

Compression:

Stored size: 1.3 KB

Contents

module Soulless
  module Dirty
    def self.included(base)
      base.class_eval do
        def initialize(params = {})
          super
          init_dirty(attribute_set.map { |a| a.name })
        end
        
        private
        def init_dirty(attributes)
          define_dirty_attributes(attributes)
          define_dirty_methods(attributes)
          @changed_attributes = {}
        end
        
        def changes_applied
          @previously_changed = changed
          @changed_attributes = {}
        end
        
        def define_dirty_attributes(attributes)
          self.class.define_attribute_methods(attributes)
        end
        
        def define_dirty_methods(attributes)
          attributes.each do |attribute|
            define_dirty_reader(attribute)
            define_dirty_writer(attribute)
          end
        end
        
        def define_dirty_reader(name)
          self.class.send(:define_method, "#{name}".to_sym) do
            instance_variable_get("@#{name}")
          end
        end
        
        def define_dirty_writer(name)
          self.class.send(:define_method, "#{name}=".to_sym) do |value|
            send("#{name}_will_change!") unless instance_variable_get("@#{name}") == value
            super(value)
          end
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
soulless-0.3.0 lib/soulless/dirty.rb