class_docstr: Template for making a decorator work as a class level decorator.  That decorator
  should extend `ClassDecorator`.  It must implement `__init__` and
  `decorate_callable`.  See `disable_logger.decorate_callable` for an example.
  `decorate_callable` should call `self._call_func()` instead of directly calling
  `func` to handle static functions.
  Note: `_call_func` is still imperfect and unit tests should be used to ensure
  everything is working properly.  There is a lot of complexity in detecting
  classmethods and staticmethods and removing the self argument in the right
  situations. For best results always use keyword args in the decorated class.
  
  `DECORATE_PRIVATE` can be set to determine whether private methods should be
  decorated. In the case of a logging decorator, you may only want to decorate things
  the user calls. But in the case of a disable logging decorator, you may want to
  decorate everything to ensure no logs escape.
code: def _call_func(
      self, func: Callable[..., T], *args: Any, **kwargs: Any
  ) -> T:
      try:
          return func(*args, **kwargs)
      except TypeError as e:
          # static functions
          try:
              return func(*args[1:], **kwargs)
          except TypeError:
              # it wasn't that it was a static function
              raise e
  
imports: from abc import ABC, abstractmethod
  from typing import Any, Callable, TypeVar
label_desc: Use image node_id 4 for calling the ClassDecorator obj's underlying member method code with example usage: obj._call_func(func) and returns: func, func