docs: def __perform_request(self, url, type=GET, params=None):
          """
              This method will perform the real request,
              in this way we can customize only the "output" of the API call by
              using self.__call_api method.
              This method will return the request object.
          """
          if params is None:
              params = {}
  
          # check we have a token
          if not self.token:
              raise SetupError("No token provided.")
  
          # check we have an endpoint
          if not self.endpoint:
              raise SetupError("No endpoint provided.")
  
          # don't show warning about self-signed certificate in dev mode
          if self.dev:
              requests.packages.urllib3.disable_warnings()
  
          url = urljoin(self.endpoint, url)
  
          # lookup table to find out the apropriate requests method,
          # headers and payload type (json or query parameters)
          identity = lambda x: x
          json_dumps = lambda x: json.dumps(x)
          lookup = {
              GET: (requests.get, {}, 'params', identity),
              POST: (requests.post, {'Content-type': 'application/json'}, 'data',
                     json_dumps),
              PUT: (requests.put, {'Content-type': 'application/json'}, 'data',
                    json_dumps),
              DELETE: (requests.delete,
                       {'content-type': 'application/json'},
                       'data', json_dumps),
          }
  
          requests_method, headers, payload, transform = lookup[type]
          headers.update({'Authorization': self.token})
          kwargs = {'headers': headers, payload: transform(params)}
  
          # remove token from log
          headers_str = str(headers).replace(self.token.strip(), 'TOKEN')
          self._log.debug('%s %s %s:%s %s' %
                          (type, url, payload, params, headers_str))
  
          return requests_method(url, verify=False, **kwargs)