module Stripe::APIOperations::Save

def self.included(base)

def self.included(base)
  # Set `metadata` as additive so that when it's set directly we remember
  # to clear keys that may have been previously set by sending empty
  # values for them.
  #
  # It's possible that not every object with `Save` has `metadata`, but
  # it's a close enough heuristic, and having this option set when there
  # is no `metadata` field is not harmful.
  base.additive_object_param(:metadata)
  base.extend(ClassMethods)
end

def save(params = {}, opts = {})

api_key to be overwritten. See {APIOperations::Request.request}.
idempotency_key to be passed in the request headers, or for the
object values) to be added to the request. E.g. to allow for an
* +opts+ - A Hash of additional options (separate from the params /
update.
in the list, it overrides the update URL used for the create or
and includes them in the create or update. If +:req_url:+ is included
* +params+ - Overrides any parameters in the resource's serialized data

==== Attributes

The resource is updated otherwise.
that can be created, then the method attempts to create the resource.
If the resource doesn't yet have an assigned ID and the resource is one

Creates or updates an API resource.
def save(params = {}, opts = {})
  # We started unintentionally (sort of) allowing attributes sent to
  # +save+ to override values used during the update. So as not to break
  # the API, this makes that official here.
  update_attributes(params)
  # Now remove any parameters that look like object attributes.
  params = params.reject { |k, _| respond_to?(k) }
  values = serialize_params(self).merge(params)
  # note that id gets removed here our call to #url above has already
  # generated a uri for this object with an identifier baked in
  values.delete(:id)
  resp, opts = request(:post, save_url, values, opts)
  initialize_from(resp.data, opts)
end

def save_url

def save_url
 switch essentially allows us "upsert"-like functionality. If the
resource doesn't have an ID set (suggesting that it's new) and
class responds to .create (which comes from
pe::APIOperations::Create), then use the URL to create a new
urce. Otherwise, generate a URL based on the object's identifier
a normal update.
f[:id].nil? && self.class.respond_to?(:create)
.class.resource_url
urce_url