Show More
@@ -126,3 +126,82 b' class delayregistrar(object):' | |||
|
126 | 126 | while self._list: |
|
127 | 127 | func, decorator = self._list.pop(0) |
|
128 | 128 | decorator(func) |
|
129 | ||
|
130 | class _funcregistrarbase(object): | |
|
131 | """Base of decorator to register a fuction for specific purpose | |
|
132 | ||
|
133 | This decorator stores decorated functions into own dict 'table'. | |
|
134 | ||
|
135 | The least derived class can be defined by overriding 'formatdoc', | |
|
136 | for example:: | |
|
137 | ||
|
138 | class keyword(_funcregistrarbase): | |
|
139 | _docformat = ":%s: %s" | |
|
140 | ||
|
141 | This should be used as below: | |
|
142 | ||
|
143 | keyword = registrar.keyword() | |
|
144 | ||
|
145 | @keyword('bar') | |
|
146 | def barfunc(*args, **kwargs): | |
|
147 | '''Explanation of bar keyword .... | |
|
148 | ''' | |
|
149 | pass | |
|
150 | ||
|
151 | In this case: | |
|
152 | ||
|
153 | - 'barfunc' is stored as 'bar' in '_table' of an instance 'keyword' above | |
|
154 | - 'barfunc.__doc__' becomes ":bar: Explanation of bar keyword" | |
|
155 | """ | |
|
156 | def __init__(self, table=None): | |
|
157 | if table is None: | |
|
158 | self._table = {} | |
|
159 | else: | |
|
160 | self._table = table | |
|
161 | ||
|
162 | def __call__(self, decl, *args, **kwargs): | |
|
163 | return lambda func: self._doregister(func, decl, *args, **kwargs) | |
|
164 | ||
|
165 | def _doregister(self, func, decl, *args, **kwargs): | |
|
166 | name = self._getname(decl) | |
|
167 | ||
|
168 | if func.__doc__ and not util.safehasattr(func, '_origdoc'): | |
|
169 | doc = func.__doc__.strip() | |
|
170 | func._origdoc = doc | |
|
171 | func.__doc__ = self._formatdoc(decl, doc) | |
|
172 | ||
|
173 | self._table[name] = func | |
|
174 | self._extrasetup(name, func, *args, **kwargs) | |
|
175 | ||
|
176 | return func | |
|
177 | ||
|
178 | def _parsefuncdecl(self, decl): | |
|
179 | """Parse function declaration and return the name of function in it | |
|
180 | """ | |
|
181 | i = decl.find('(') | |
|
182 | if i >= 0: | |
|
183 | return decl[:i] | |
|
184 | else: | |
|
185 | return decl | |
|
186 | ||
|
187 | def _getname(self, decl): | |
|
188 | """Return the name of the registered function from decl | |
|
189 | ||
|
190 | Derived class should override this, if it allows more | |
|
191 | descriptive 'decl' string than just a name. | |
|
192 | """ | |
|
193 | return decl | |
|
194 | ||
|
195 | _docformat = None | |
|
196 | ||
|
197 | def _formatdoc(self, decl, doc): | |
|
198 | """Return formatted document of the registered function for help | |
|
199 | ||
|
200 | 'doc' is '__doc__.strip()' of the registered function. | |
|
201 | """ | |
|
202 | return self._docformat % (decl, doc) | |
|
203 | ||
|
204 | def _extrasetup(self, name, func): | |
|
205 | """Execute exra setup for registered function, if needed | |
|
206 | """ | |
|
207 | pass |
General Comments 0
You need to be logged in to leave comments.
Login now