code: def CountDictCall(keyfunc):
      
      def decorator(fn):
          if use_memoizer:
              def wrapper(self, *args, **kwargs):
                  global CounterList
                  key = self.__class__.__name__+'.'+fn.__name__
                  if key not in CounterList:
                      CounterList[key] = CountDict(self.__class__.__name__, fn.__name__, keyfunc)
                  CounterList[key].count(self, *args, **kwargs)
                  return fn(self, *args, **kwargs)
              wrapper.__name__= fn.__name__
              return wrapper
          else:
              return fn
      return decorator
docs: Decorator for counting memoizer hits/misses while accessing
          dictionary values with a key-generating function. Like
          CountMethodCall above, it wraps the given method
          fn and uses a CountDict object to keep track of the
          caching statistics. The dict-key function keyfunc has to
          get passed in the decorator call and gets stored in the
          CountDict instance.
          Wrapping gets enabled by calling EnableMemoization().