'Call a specially-designated local method.
self.callRemote(\'x\') will first try to invoke a method named
sync_x and return its result (which should probably be a
Deferred).  Second, it will look for a method called async_x,
which will be called and then have its result (or Failure)
automatically wrapped in a Deferred.'

def callRemote(self, name, *args, **kw):

    if hasattr(self, ('sync_' + name)):
        return getattr(self, ('sync_' + name))(*args, **kw)
    try:
        method = getattr(self, ('async_' + name))
        return defer.succeed(method(*args, **kw))
    except:
        f = Failure()
        if self.reportAllTracebacks:
            f.printTraceback()
        return defer.fail(f)
