1from zope.interface.advice import addClassAdvisor
2
3def method_factory_factory(method):
4    def factory(regex):
5        _f = {}
6        def decorator(f):
7            _f[f.__name__] = f
8            return f
9        def advisor(cls):
10            def wrapped(f):
11                def __init__(self, *args, **kwargs):
12                    f(self, *args, **kwargs)
13                    for func_name in _f:
14                        orig = _f[func_name]
15                        func = getattr(self, func_name)
16                    if func.im_func==orig:
17                        self.register(method, regex, func)
18                return __init__
19            cls.__init__ = wrapped(cls.__init__)
20            return cls
21        addClassAdvisor(advisor)
22        return decorator
23    return factory
24
25ALL    = method_factory_factory('ALL')
26GET    = method_factory_factory('GET')
27POST   = method_factory_factory('POST')
28PUT    = method_factory_factory('PUT')
29DELETE = method_factory_factory('DELETE')
30