'Proxy for a call to the weak referenced object. Take
arbitrary params to pass to the callable.
Raises `ReferenceError`: When the weak reference refers to
a dead object'

def __call__(self, *args, **kwargs):

    if ((self.inst is not None) and (self.inst() is None)):
        raise ReferenceError
    elif (self.inst is not None):
        mtd = types.MethodType(self.func, self.inst())
    else:
        mtd = self.func
    return mtd(*args, **kwargs)
