module Savon
module Model
def self.extended(base)
base.setup
end
def setup
class_action_module
instance_action_module
end
def actions(*actions)
actions.each do |action|
define_class_action(action)
define_instance_action(action)
end
end
private
def define_class_action(action)
class_action_module.module_eval %{
def #{action.to_s.snakecase}(body = nil, &block)
response = client.request :wsdl, #{action.inspect}, :body => body, &block
config.hooks.select(:model_soap_response).call(response) || response
end
}
end
def define_instance_action(action)
instance_action_module.module_eval %{
def #{action.to_s.snakecase}(body = nil, &block)
self.class.#{action.to_s.snakecase} body, &block
end
}
end
def class_action_module
@class_action_module ||= Module.new do
def config
@config ||= Savon.config.clone
end
def client(&block)
@client ||= Savon::Client.new(&block)
end
def endpoint(uri)
client.wsdl.endpoint = uri
end
def namespace(uri)
client.wsdl.namespace = uri
end
def document(uri)
client.wsdl.document = uri
end
def ()
client.http. =
end
def basic_auth(login, password)
client.http.auth.basic(login, password)
end
def wsse_auth(*args)
client.wsse.credentials(*args)
end
end.tap { |mod| extend(mod) }
end
def instance_action_module
@instance_action_module ||= Module.new do
def client(&block)
self.class.client(&block)
end
end.tap { |mod| include(mod) }
end
end
end