module AWS::Record::DirtyTracking

def attribute_change attribute_name

def attribute_change attribute_name
  self.class.attribute_for(attribute_name) do |attribute|
    if orig_values.has_key?(attribute.name)
      [orig_values[attribute.name], __send__(attribute.name)]
    else
      nil
    end
  end
end

def attribute_changed? attribute_name

def attribute_changed? attribute_name
  orig_values.keys.include?(attribute_name)
end

def attribute_was attribute_name

def attribute_was attribute_name
  self.class.attribute_for(attribute_name) do |attribute|
    name = attribute.name
    orig_values.has_key?(name) ? orig_values[name] : __send__(name)
  end
end

def attribute_will_change! attribute_name

def attribute_will_change! attribute_name
  self.class.attribute_for(attribute_name) do |attribute|
    name = attribute.name
    unless orig_values.has_key?(name)
      was = __send__(name)
      begin
        # booleans, nil, etc all #respond_to?(:clone), but they raise
        # a TypeError when you attempt to dup them.  
        orig_values[name] = was.clone
      rescue TypeError
        orig_values[name] = was
      end
    end
  end
  nil
end

def changed

Returns:
  • (Array) - Returns an array of attribute names that have
def changed
  orig_values.keys
end

def changed?

Returns:
  • (Boolean) - Returns true if any of the attributes have
def changed?
  !orig_values.empty?
end

def changes

Returns:
  • (Hash) - Returns a hash of attribute changes.
def changes
  changed.inject({}) do |changes, attr_name|
    changes[attr_name] = attribute_change(attr_name)
    changes
  end
end

def clear_change! attribute_name

def clear_change! attribute_name
  orig_values.delete(attribute_name)
end

def clear_changes!

def clear_changes!
  orig_values.clear
end

def if_tracking_changes &block

def if_tracking_changes &block
  yield unless @_ignore_changes
end

def ignore_changes &block

def ignore_changes &block
  begin
    @_ignore_changes = true
    yield
  ensure
    @_ignore_changes = false
  end
end

def orig_values

def orig_values
  @_orig_values ||= {}
end

def reset_attribute! attribute_name

def reset_attribute! attribute_name
  __send__("#{attribute_name}=", attribute_was(attribute_name))
  nil
end