class ActiveModel::AttributeMutationTracker

:nodoc:

def any_changes?

def any_changes?
  attr_names.any? { |attr| changed?(attr) }
end

def attr_names

def attr_names
  attributes.keys
end

def attribute_changed?(attr_name)

def attribute_changed?(attr_name)
  forced_changes.include?(attr_name) || !!attributes[attr_name].changed?
end

def change_to_attribute(attr_name)

def change_to_attribute(attr_name)
  if changed?(attr_name)
    [original_value(attr_name), fetch_value(attr_name)]
  end
end

def changed?(attr_name, from: OPTION_NOT_GIVEN, to: OPTION_NOT_GIVEN)

def changed?(attr_name, from: OPTION_NOT_GIVEN, to: OPTION_NOT_GIVEN)
  attribute_changed?(attr_name) &&
    (OPTION_NOT_GIVEN == from || original_value(attr_name) == type_cast(attr_name, from)) &&
    (OPTION_NOT_GIVEN == to || fetch_value(attr_name) == type_cast(attr_name, to))
end

def changed_attribute_names

def changed_attribute_names
  attr_names.select { |attr_name| changed?(attr_name) }
end

def changed_in_place?(attr_name)

def changed_in_place?(attr_name)
  attributes[attr_name].changed_in_place?
end

def changed_values

def changed_values
  attr_names.each_with_object({}.with_indifferent_access) do |attr_name, result|
    if changed?(attr_name)
      result[attr_name] = original_value(attr_name)
    end
  end
end

def changes

def changes
  attr_names.each_with_object({}.with_indifferent_access) do |attr_name, result|
    if change = change_to_attribute(attr_name)
      result.merge!(attr_name => change)
    end
  end
end

def fetch_value(attr_name)

def fetch_value(attr_name)
  attributes.fetch_value(attr_name)
end

def force_change(attr_name)

def force_change(attr_name)
  forced_changes[attr_name] = fetch_value(attr_name)
end

def forced_changes

def forced_changes
  @forced_changes ||= {}
end

def forget_change(attr_name)

def forget_change(attr_name)
  attributes[attr_name] = attributes[attr_name].forgetting_assignment
  forced_changes.delete(attr_name)
end

def initialize(attributes)

def initialize(attributes)
  @attributes = attributes
end

def original_value(attr_name)

def original_value(attr_name)
  attributes[attr_name].original_value
end

def type_cast(attr_name, value)

def type_cast(attr_name, value)
  attributes[attr_name].type_cast(value)
end