'''
@author: Alan Franzoni
'''
from twisted.internet.defer import Deferred
class ShouldntBecalledError(Exception):
pass
class PublicDeferred(Deferred):
"""
PublicDeferred decorator.
Prevents calling methods which should be just be called by the "real"
deferred object owner. If such calls occur, an error is immediately raised.
"""
def __init__(self, original_d):
self.__dict__ = original_d.__dict__
def callback(self, result):
raise ShouldntBecalledError, "callback() should only be called by the owner!"
def errback(self, failuire):
raise ShouldntBecalledError, "errback() should only be called by the owner!"
if __name__ == '__main__':
"""
example usage:
if you don't want somebody to mess up with your internals, do what you need
with your deferred and wrap it into a PublicDeferred before returning it.
"""
from twisted.internet import reactor
from twisted.web.client import getPage
def publicGetPage(*args, **kwargs):
d = getPage(*args, **kwargs)
return PublicDeferred(d)
def printResult(result):
print result
d = publicGetPage("http://www.google.com")
d.addCallback(printResult)
reactor.callLater(0, d.callback, "hello, there!")
reactor.run()