docs: def _make_decorator(measuring_func):
      """morass of closures for making decorators/descriptors"""
      def _decorator(name = None, metric = call_default):
          def wrapper(func):
  
              name_ = name if name is not None else func.__module__ + '.' +func.__name__
              class instrument_decorator(object): # must be a class for descriptor magic to work
                  @wraps(func)
                  def __call__(self, *args, **kwargs):
                      return measuring_func(func(*args, **kwargs), name_, metric)
  
                  def __get__(self, instance, class_):
                      name_ = name if name is not None else\
                          ".".join((class_.__module__, class_.__name__, func.__name__))
                      @wraps(func)
                      def wrapped_method(*args, **kwargs):
                          return measuring_func(func(instance, *args, **kwargs), name_, metric)
                      return wrapped_method
              return instrument_decorator()
  
          return wrapper
      return _decorator