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 decorate_class(self, klass: T) -> T:
      for attr in dir(klass):
          if not self.DECORATE_PRIVATE and attr[0] == "_":
              continue
  
          attr_value = getattr(klass, attr)
          if (
              not callable(attr_value)
              or isinstance(attr_value, type)
              or attr
              in (
                  "__subclasshook__",
                  "__class__",
                  "__repr__",
                  "__str__",
                  "__getattribute__",
                  "__new__",
                  "__call__",
                  "__eq__",
                  "_call_func",
              )
          ):
              continue
  
          setattr(klass, attr, self.decorate_callable(attr_value))
      return klass
  
imports: from abc import ABC, abstractmethod
  from typing import Any, Callable, TypeVar
label_desc: Use image node_id 1 for calling the ClassDecorator obj's underlying member method code with example usage: obj.decorate_class(klass) and returns: klass