docs: def _wrap_functions(self, client):
          """Wrap public functions to catch ConnectionError.
  
          When an error happens, it puts the client in the penalty box
          so that it won't be retried again for a little while.
          """
  
          def wrap(fn):
              def wrapper(*args, **kwargs):
                  """Simple wrapper for to catch dead clients."""
                  try:
                      return fn(*args, **kwargs)
                  except (ConnectionError, TimeoutError):  # TO THE PENALTY BOX!
                      self._penalize_client(client)
                      raise
  
              return functools.update_wrapper(wrapper, fn)
  
          for name in dir(client):
              if name.startswith("_"):
                  continue
              # Some things aren't wrapped
              if name in ("echo", "execute_command", "parse_response"):
                  continue
              obj = getattr(client, name)
              if not callable(obj):
                  continue
              log.debug("Wrapping %s", name)
              setattr(client, name, wrap(obj))