class Matcher(object): def __init__(self, cls): self.cls = cls def __call__(self, *args): self.children = args return self def __getattr__(self, name): return Matcher(getattr(self.cls, name)) def __repr__(self): return self.cls.__name__ + `self.children` class Pattern(object): def __init__(self, namespace): self.namespace = namespace def __call__(self, func): names = func.func_code.co_names for name in names: try: cls = getattr(self.namespace, name) func.func_globals[name] = Matcher(cls) except: pass return func() class Foo(object): class Test(object): class Omg(object): pass class Foo(object): pass class Bar(object): pass @Pattern(Foo) def testPattern(): return \ Test( Test.Omg(), Foo(), Bar() ) print testPattern