Source code for enaml.callableref

#------------------------------------------------------------------------------
#  Copyright (c) 2012, Enthought, Inc.
#  All rights reserved.
#------------------------------------------------------------------------------
from weakref import ref


[docs]class CallableRef(object): """ An object which will weakly wrap a callable object. This class is useful when weakrefs to callable objects need to be used alongside regular callables. It exposes a callable interface which will dererence the underlying callable before calling it. """ __slots__ = '_objref'
[docs] def __init__(self, obj, callback=None): """ Initialize a CallableRef. Parameters ---------- obj : callable The callable object which should be weakly wrapped. callback : callable or None An optional callable to invoke when the object has been garbage collected. It will be passed the weakref instance for associated with the dead object. Notes ----- Instances of this class will compare equally to equivalent CallableRef instances as well as weakref instances which compare equally to the internal weakref. """ self._objref = ref(obj, callback)
[docs] def __eq__(self, other): """ Custom equality checking for a CallableRef. This will return True for an equivalent CallableRef *or* a weakref pointing to the same underlying callable. """ if isinstance(other, CallableRef): return self._objref == other._objref if isinstance(other, ref): return self._objref == other return False
[docs] def __call__(self, *args, **kwargs): """ Invoke the underlying callable. Parameters ---------- *args, **kwargs The positional and keyword arguments to pass to the callable. Returns ------- result : object The results of the callable, or None if it has already been garbage collected. """ obj = self._objref() if obj is not None: return obj(*args, **kwargs) # Use the faster version of CallableRef if it's available.
try: from enaml.extensions.callableref import CallableRef except ImportError: pass