try: callable except NameError: # Python 3.0 or 3.1, sigh. def callable(obj): return hasattr(type(obj), '__call__') class chained: def __init__(self, obj): self.obj = obj def __repr__(self): return repr(self.obj) def __getattr__(self, name): attr = getattr(self.obj, name) if callable(attr): def selfie(*args, **kw): # Call the method just for side-effects, return self. _ = attr(*args, **kw) return self return selfie else: return attr