module Stripe::APIOperations::NestedResource

def define_operation(

def define_operation(
ce,
ion,
ce_url_method,
ce_plural
peration
create
ne_singleton_method(:"create_#{resource}") \
do |id, params = {}, opts = {}|
quest_stripe_object(
method: :post,
path: send(resource_url_method, id),
params: params,
opts: opts
retrieve
ne_singleton_method(:"retrieve_#{resource}") \
do |id, nested_id, opts = {}|
quest_stripe_object(
method: :get,
path: send(resource_url_method, id, nested_id),
params: {},
opts: opts
update
ne_singleton_method(:"update_#{resource}") \
do |id, nested_id, params = {}, opts = {}|
quest_stripe_object(
method: :post,
path: send(resource_url_method, id, nested_id),
params: params,
opts: opts
delete
ne_singleton_method(:"delete_#{resource}") \
do |id, nested_id, params = {}, opts = {}|
quest_stripe_object(
method: :delete,
path: send(resource_url_method, id, nested_id),
params: params,
opts: opts
list
ne_singleton_method(:"list_#{resource_plural}") \
do |id, params = {}, opts = {}|
quest_stripe_object(
method: :get,
path: send(resource_url_method, id),
params: params,
opts: opts
e ArgumentError, "Unknown operation: #{operation.inspect}"

def nested_resource_class_methods(resource, path: nil, operations: nil,

def nested_resource_class_methods(resource, path: nil, operations: nil,
                                  resource_plural: nil)
  resource_plural ||= "#{resource}s"
  path ||= resource_plural
  raise ArgumentError, "operations array required" if operations.nil?
  resource_url_method = :"#{resource}s_url"
  define_singleton_method(resource_url_method) do |id, nested_id = nil|
    url = "#{resource_url}/#{CGI.escape(id)}/#{CGI.escape(path)}"
    url += "/#{CGI.escape(nested_id)}" unless nested_id.nil?
    url
  end
  operations.each do |operation|
    define_operation(
      resource,
      operation,
      resource_url_method,
      resource_plural
    )
  end
end