@withTiming()
def __call__(cls, mobject, exists=True, modifier=None):
    handle = om.MObjectHandle(mobject)
    hsh = handle.hashCode()
    hx = ('%x' % hsh)
    if (exists and handle.isValid()):
        try:
            node = cls._instances[hx]
            assert (not node._destroyed)
        except (KeyError, AssertionError):
            pass
        else:
            Stats.NodeReuseCount += 1
            node._removed = False
            return node
    if mobject.hasFn(om.MFn.kDagNode):
        sup = DagNode
    elif mobject.hasFn(om.MFn.kSet):
        sup = ObjectSet
    elif mobject.hasFn(om.MFn.kAnimCurve):
        sup = AnimCurve
    else:
        sup = Node
    self = super(Singleton, sup).__call__(mobject, exists, modifier)
    self._hashCode = hsh
    self._hexStr = hx
    cls._instances[hx] = self
    return self
@withTiming()
def __call__(cls, mobject, exists=True, modifier=None):
    handle = om.MObjectHandle(mobject)
    hsh = handle.hashCode()
    hx = ('%x' % hsh)
    if (exists and handle.isValid()):
        try:
            node = cls._instances[hx]
            assert (not node._destroyed)
        except (KeyError, AssertionError):
            pass
        else:
            Stats.NodeReuseCount += 1
            node._removed = False
            return node
    if mobject.hasFn(om.MFn.kDagNode):
        sup = DagNode
    elif mobject.hasFn(om.MFn.kSet):
        sup = ObjectSet
    elif mobject.hasFn(om.MFn.kAnimCurve):
        sup = AnimCurve
    else:
        sup = Node
    self = super(Singleton, sup).__call__(mobject, exists, modifier)
    self._hashCode = hsh
    self._hexStr = hx
    cls._instances[hx] = self
    return self