Mercurial > traipse_dev
comparison plugins/cherrypy/lib/aspect.py @ 0:4385a7d0efd1 grumpy-goblin
Deleted and repushed it with the 'grumpy-goblin' branch. I forgot a y
author | sirebral |
---|---|
date | Tue, 14 Jul 2009 16:41:58 -0500 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:4385a7d0efd1 |
---|---|
1 """ | |
2 Copyright (c) 2004, CherryPy Team (team@cherrypy.org) | |
3 All rights reserved. | |
4 | |
5 Redistribution and use in source and binary forms, with or without modification, | |
6 are permitted provided that the following conditions are met: | |
7 | |
8 * Redistributions of source code must retain the above copyright notice, | |
9 this list of conditions and the following disclaimer. | |
10 * Redistributions in binary form must reproduce the above copyright notice, | |
11 this list of conditions and the following disclaimer in the documentation | |
12 and/or other materials provided with the distribution. | |
13 * Neither the name of the CherryPy Team nor the names of its contributors | |
14 may be used to endorse or promote products derived from this software | |
15 without specific prior written permission. | |
16 | |
17 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | |
18 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | |
19 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
20 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE | |
21 FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
22 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | |
23 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | |
24 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |
25 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
26 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
27 """ | |
28 | |
29 # return codes for _before and _after aspect methods | |
30 STOP = 0 | |
31 CONTINUE = 1 | |
32 | |
33 class Aspect(object): | |
34 """ | |
35 Base class for aspects. Derive new aspect classes from this, then | |
36 override one or both of _before and _after. | |
37 """ | |
38 | |
39 def __getattribute__(self, methodName): | |
40 | |
41 # find method specified by methodName | |
42 try: | |
43 method = object.__getattribute__(self, methodName) | |
44 except: | |
45 raise | |
46 | |
47 # if requested attribute is not a method, simply return it | |
48 if not callable(method): | |
49 return method | |
50 | |
51 # define wrapper function | |
52 def _wrapper(*k, **kw): | |
53 # call _before method | |
54 status, value = object.__getattribute__(self, '_before')(methodName, method) | |
55 if status == STOP: | |
56 return value | |
57 | |
58 # call wrapped method and append results | |
59 result = method(*k, **kw) | |
60 if value: | |
61 result = value + result | |
62 | |
63 # call _after method | |
64 status, value = object.__getattribute__(self, '_after')(methodName, method) | |
65 if status == STOP: | |
66 return value | |
67 if value: | |
68 result += value | |
69 | |
70 # done! | |
71 return result | |
72 | |
73 # expose wrapper function if wrapped method is exposed | |
74 if getattr(method, 'exposed', None): | |
75 _wrapper.exposed = True | |
76 | |
77 # return wrapper function. It'll get called instead of the | |
78 # requested method. | |
79 return _wrapper | |
80 | |
81 | |
82 def _before(self, methodName, method): | |
83 return CONTINUE, None | |
84 | |
85 | |
86 def _after(self, methodName, method): | |
87 return CONTINUE, None |