code: 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
docs: 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]