code: def _message(self, request_cls, destination=None, message_id=0,
                   consent=None, extensions=None, sign=False, sign_prepare=False,
                   nsprefix=None, sign_alg=None, digest_alg=None, **kwargs):
          
          if not message_id:
              message_id = sid()
  
          for key, val in self.message_args(message_id).items():
              if key not in kwargs:
                  kwargs[key] = val
  
          req = request_cls(**kwargs)
  
          if destination:
              req.destination = destination
  
          if consent:
              req.consent = "true"
  
          if extensions:
              req.extensions = extensions
  
          if nsprefix:
              req.register_prefix(nsprefix)
  
          if self.msg_cb:
              req = self.msg_cb(req)
  
          reqid = req.id
  
          if sign:
              return reqid, self.sign(req, sign_prepare=sign_prepare,
                                      sign_alg=sign_alg, digest_alg=digest_alg)
          else:
              logger.info("REQUEST: %s", req)
              return reqid, req
docs: Some parameters appear in all requests so simplify by doing
          it in one place
  
          :param request_cls: The specific request type
          :param destination: The recipient
          :param message_id: A message identifier
          :param consent: Whether the principal have given her consent
          :param extensions: Possible extensions
          :param sign: Whether the request should be signed or not.
          :param sign_prepare: Whether the signature should be prepared or not.
          :param kwargs: Key word arguments specific to one request type
          :return: A tuple containing the request ID and an instance of the
              request_cls