public function call($method, $request = null, $parameters = null, $headers = null, $options = [])
    {
        // build up ServiceRequest
        if (is_a($request, ServiceRequestInterface::class)) {
            /** @var ServiceRequestInterface $request */
            $this->request = $request->setMethod($method);

        } else {
            // $request is the request body

            $class = $this->requestDefaultsClass;

            $this->request = new $class($request, $parameters, $headers, $method, null, $options);

            $this->checkRequestClassType($this->request);
        }

        $this->checkRequest();

        $this->supplementRequestWithDefaults();

        $this->resetResponseInformation();


        if ( ! $this->firstCallIsMade) {
            $this->firstCallIsMade = true;
            $this->beforeFirstCall();
        }

        $this->before();

        $this->rawResponse = $this->callRaw($this->request);

        $this->afterRaw();

        $this->interpretResponse();

        $this->after();

        return $this->getLastInterpretedResponse();
    }