Sha256: 6bedfd7e11e295236102af69128aae55ce4cab889d77bffa054f79576959613e

Contents?: true

Size: 1.22 KB

Versions: 3

Compression:

Stored size: 1.22 KB

Contents

module Pupper
  module TrackableAttributes
    def self.included(base)
      base.send :include, ActiveModel::Dirty
      base.send :include, InstanceMethods

      class << base
        prepend ClassMethods
      end
    end

    module InstanceMethods
      def attributes
        @attributes ||= {}
      end

      def new_changes
        changes.transform_values(&:last)
      end

      def reload!
        restore_attributes
      end

      def rollback!
        restore_attributes
      end

      def refresh(**attrs)
        assign_attributes(**attrs)
        changes_applied
      end
    end

    module ClassMethods
      def _attributes
        @_attributes ||= []
      end

      def _attributes=(attrs)
        @_attributes = attrs
      end

      def attr_accessor(*attrs)
        # override the default so that we can hook into the created methods
        define_attribute_methods(*attrs)

        _attributes << attrs

        attrs.each do |attr|
          define_method attr do
            attributes[attr]
          end

          define_method "#{attr}=" do |value|
            send("#{attr}_will_change!") unless value == send(attr)
            attributes[attr] = value
          end
        end
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
pupper-0.2.0 lib/pupper/trackable_attributes.rb
pupper-0.1.13 lib/pupper/trackable_attributes.rb
pupper-0.1.12 lib/pupper/trackable_attributes.rb