'Get a random new name, pass an obj to get a cached one'

def __call__(self, *args):

    if (not args):
        self._count += 1
        res = ('t%d' % self._count)
    else:
        obj = args[0]
        try:
            return self._obj_cache[id(obj)][0]
        except KeyError:
            self._count += 1
            res = ('e%d' % self._count)
            self._obj_cache[id(obj)] = (res, obj)
    while (res in self._blacklist):
        res += '_'
    self._blacklist.add(res)
    return res
