Sha256: 184a256880ddb999d5019dc05901abe2a7086f1f0e585ce5346aa475d4f19b56

Contents?: true

Size: 1.23 KB

Versions: 1

Compression:

Stored size: 1.23 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 changed_attributes
        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

1 entries across 1 versions & 1 rubygems

Version Path
pupper-0.1.11 lib/pupper/trackable_attributes.rb