code: def do_publish(broker, cmd, f, when, res, meta, *args, **kwargs):
      
      publish_command = functools.partial(
          broker.publish,
          topic=command_types.COMMAND)
      call_args = _get_args(f, args, kwargs)
      if when == 'before':
          broker.logger.info("{}: {}".format(
              f.__qualname__,
              {k: v for k, v in call_args.items() if str(k) != 'self'}))
      command_args = dict(
          zip(
              reversed(inspect.getfullargspec(cmd).args),
              reversed(inspect.getfullargspec(cmd).defaults
                       or [])))
  
      # TODO (artyom, 20170927): we are doing this to be able to use
      # the decorator in Instrument class methods, in which case
      # self is effectively an instrument.
      # To narrow the scope of this hack, we are checking if the
      # command is expecting instrument first.
      if 'instrument' in inspect.getfullargspec(cmd).args:
          # We are also checking if call arguments have 'self' and
          # don't have instruments specified, in which case
          # instruments should take precedence.
          if 'self' in call_args and 'instrument' not in call_args:
              call_args['instrument'] = call_args['self']
  
      command_args.update({
          key: call_args[key]
          for key in
          (set(inspect.getfullargspec(cmd).args)
           & call_args.keys())
      })
  
      if meta:
          command_args['meta'] = meta
  
      payload = cmd(**command_args)
  
      message = {**payload, '$': when}
      if when == 'after':
          message['return'] = res
      publish_command(
          message={**payload, '$': when})
docs: Implement the publish so it can be called outside the decorator