code: def request(self, method, *parts, **options):
          
          if len(parts) != 0:
              # the chain will be extended with the parts and finally a
              # request will be triggered
              return self.__call__(*parts).request(method=method, **options)
  
          else:
              if 'url' not in options:
                  # the last part constructs the URL
                  options['url'] = self.url()
  
              for key, value in six.iteritems(self.config):
                  # set the defaults in the options
                  if value is not None:
                      if isinstance(value, dict):
                          # prevents overwriting default values in dicts
                          copy = value.copy()
                          if options.get(key):
                              copy.update(options[key])
                          options[key] = copy
                      else:
                          options.setdefault(key, value)
  
              # at this point, we're ready to completely go down the chain
              return self._parent.request(method=method, **options)
docs: Requests a URL and returns a *Bunched* response.
  
          This method basically wraps the request method of the requests
          module and adds a `path` and `debug` option.
  
          :param method: The request method, e.g. 'get', 'post', etc.
          :param parts: (optional) Additional path parts to append to the URL
          :param options: (optional) Arguments that will be passed to
              the `requests.request` method
          :return: :class:`Bunch` object from JSON-parsed response