/**
  * Execute an API call using a certain method
  *
  * @param ApiCallInterface $call The API call
  *
  * @return string The parsed response of the API call
  */
 public function call(ApiCallInterface $call)
 {
     if ($call instanceof CurlCall) {
         if ($this->freshConnect || $this->engine == null || !$this->engine instanceof Curl) {
             $this->engine = new Curl();
         }
     } else {
         if ($this->freshConnect || $this->engine == null || !$this->engine instanceof \SoapClient) {
             $this->engine = new \SoapClient($call->getUrl());
         }
     }
     if ($this->logger) {
         $this->logger->startCall($call);
     }
     $this->lastCall = $call;
     $result = $call->execute($this->options, $this->engine, $this->freshConnect);
     if ($this->logger) {
         $this->logger->stopCall($call);
     }
     if ($call instanceof CurlCall) {
         if ($this->freshConnect) {
             $this->engine->close();
         }
     }
     return $result;
 }
 /**
  * {@inheritdoc}
  */
 public function stopCall(ApiCallInterface $call)
 {
     $status = $call->getStatus();
     $responseData = $call->getResponseData();
     $responseObject = $call->getResponseObjectRepresentation();
     $executionMS = microtime(true) - $this->start;
     $this->calls[$this->currentCall] += compact('status', 'responseData', 'responseObject', 'executionMS');
     if (null !== $this->logger) {
         $type = $this->calls[$this->currentCall]['type'];
         $url = $this->calls[$this->currentCall]['url'];
         $requestData = $this->calls[$this->currentCall]['requestData'];
         $responseDataLength = strlen($responseData);
         $executionMS = sprintf('%0.2f', $executionMS * 1000);
         $this->logger->debug("API call \"{$type}\" requested \"{$url}?{$requestData}\" that returned \"{$status}\" in {$executionMS} ms sending {$responseDataLength} bytes");
     }
 }