def attribute_updates(include_all = false)
      # TODO: Replace this algorithm with reduce()
      h = {}
      changed.each do |key|
        key = key.to_sym
        next if include_all == false && Parse::Properties::BASE_KEYS.include?(key)
        next unless fields[key].present?
        remote_field = self.field_map[key] || key
        h[remote_field] = send key
        h[remote_field] = {__op: :Delete} if h[remote_field].nil?
        # in the case that the field is a Parse object, generate a pointer
        # if it is a Parse::PointerCollectionProxy, then make sure we get a list of pointers.
        h[remote_field] = h[remote_field].parse_pointers if h[remote_field].is_a?(Parse::PointerCollectionProxy)
        h[remote_field] = h[remote_field].pointer if h[remote_field].respond_to?(:pointer)
      end
      h
    end
def attribute_updates(include_all = false)
      # TODO: Replace this algorithm with reduce()
      h = {}
      changed.each do |key|
        key = key.to_sym
        next if include_all == false && Parse::Properties::BASE_KEYS.include?(key)
        next unless fields[key].present?
        remote_field = self.field_map[key] || key
        h[remote_field] = send key
        h[remote_field] = {__op: :Delete} if h[remote_field].nil?
        # in the case that the field is a Parse object, generate a pointer
        # if it is a Parse::PointerCollectionProxy, then make sure we get a list of pointers.
        h[remote_field] = h[remote_field].parse_pointers if h[remote_field].is_a?(Parse::PointerCollectionProxy)
        h[remote_field] = h[remote_field].pointer if h[remote_field].respond_to?(:pointer)
      end
      h
    end
Returns a hash of attributes for properties that have changed. This will
 not include any of the base attributes (ex. id, created_at, etc).
 This method helps generate the change payload that will be sent when saving
 objects to Parse.
 @param include_all [Boolean] whether to include all {Parse::Properties::BASE_KEYS} attributes.
 @return [Hash]