"""An example of the mark and recapture decorator pattern, 
designed to make connecting bound methods as callbacks easy.
Gareth Latty <gareth@lattyware.co.uk> 
http://b...content-available-to-author-only...o.uk/post/29793030567/mark-and-recapture-decorators-in-python"""

import inspect

def connect(signal, f):
	print(signal, f)

def naive_callback(*args):
	def decorate(f):
		connect(args, f)
		return f
	return decorate

def callback(*args):
    def decorate(f):
        try:
            f._marks.add(args)
        except AttributeError:
            f._marks = {args}
        return f
    return decorate
    
def connect_callbacks(obj):
    for _, f in inspect.getmembers(obj, inspect.ismethod):
        try:
            for mark in f.__func__._marks:
                connect(mark, f)
        except AttributeError:
             pass

class Test:
	def __init__(self):
		connect_callbacks(self)

	@naive_callback("test")
	def test1():
		pass

	@callback("test")
	def test2():
		pass
		
test = Test()