mς ΪΕ~Bc@s­dZdkZdefd„ƒYZd„Zd„Zd„Zd„ZdZd Z d Z d Z d „Z d „Z d„Zd„Zd„Zd„Zd„Zd„ZdS(s– I define support for hookable instance methods. These are methods which you can register pre-call and post-call external functions to augment their functionality. People familiar with more esoteric languages may think of these as "method combinations". This could be used to add optional preconditions, user-extensible callbacks (a-la emacs) or a thread-safety mechanism. The four exported calls are: - L{addPre} - L{addPost} - L{removePre} - L{removePost} All have the signature (class, methodName, callable), and the callable they take must always have the signature (instance, *args, **kw) unless the particular signature of the method they hook is known. Hooks should typically not throw exceptions, however, no effort will be made by this module to prevent them from doing so. Pre-hooks will always be called, but post-hooks will only be called if the pre-hooks do not raise any exceptions (they will still be called if the main method raises an exception). The return values and exception status of the main method will be propogated (assuming none of the hooks raise an exception). Hooks will be executed in the order in which they are added. Nt HookErrorcBstZdZRS(s7An error which will fire when an invariant is violated.(t__name__t __module__t__doc__(((tk/home/radix/Projects/Twisted/branches/releases/twisted-core-2.5.x-2329-2/Twisted.exp/twisted/python/hook.pyR+s cCst||t|ƒdS(suhook.addPre(klass, name, func) -> None Add a function to be called before the method klass.name is invoked. N(t_addHooktklasstnametPREtfunc(RRR ((RtaddPre.scCst||t|ƒdS(suhook.addPost(klass, name, func) -> None Add a function to be called after the method klass.name is invoked. N(RRRtPOSTR (RRR ((RtaddPost6scCst||t|ƒdS(s‘hook.removePre(klass, name, func) -> None Remove a function (previously registered with addPre) so that it is no longer executed before klass.name. N(t _removeHookRRRR (RRR ((Rt removePre=scCst||t|ƒdS(s‘hook.removePre(klass, name, func) -> None Remove a function (previously registered with addPost) so that it is no longer executed after klass.name. N(R RRR R (RRR ((Rt removePostFss3 import %(module)s def %(name)s(*args, **kw): klazz = %(module)s.%(klass)s for preMethod in klazz.%(preName)s: preMethod(*args, **kw) try: return klazz.%(originalName)s(*args, **kw) finally: for postMethod in klazz.%(postName)s: postMethod(*args, **kw) s__hook_pre_%s_%s_%s__s__hook_post_%s_%s_%s__s__hook_orig_%s_%s_%s__cCs,|ti|iddƒ|i|f}|S(sstring manipulation garbaget.t_N(tststringtreplacetkRRtntx(RRRR((Rt_XXXds(cCst||tƒS(sC(private) munging to turn a method name into a pre-hook-method-nameN(RRRt_PRE(RR((RRiscCst||tƒS(sD(private) munging to turn a method name into a post-hook-method-nameN(RRRt_POST(RR((RR mscCst||tƒS(sE(private) munging to turn a method name into an `original' identifierN(RRRt_ORIG(RR((RtORIGqscCslt||ƒt||||ƒƒpt||||ƒgƒnt||||ƒƒ}|i|ƒdS(s,(private) adds a hook to a method on a classN( t_enhookRRthasattrtphasetsetattrtgetattrt phaselisttappendR (RRRR R"((RRvs  cCsΦ|||ƒ}t|t||ƒƒptdƒ‚nt||||ƒƒ}y|i |ƒWn)t j otd||fƒ‚nXt|t ||ƒƒ o+t|t ||ƒƒ ot||ƒndS(s1(private) removes a hook from a method on a classsno hooks present!s(hook %s not found in removal list for %sN(RRRt phaselistnameRRRR!R"tremoveR t ValueErrorRR t_dehook(RRRR R$R"((RR s4csΔtˆtˆˆƒƒodSn‡‡d†}y ˆ|_Wntj onXtˆˆƒi}t ˆtˆˆƒ|ƒt ˆt ˆˆƒgƒt ˆt ˆˆƒgƒt ˆˆ|ƒdS(s>(private) causes a certain method name to be hooked on a classNcs‹x-tˆtˆˆƒƒD]}|||ŽqWz#tˆtˆˆƒƒ||ŽSWdx-tˆtˆˆƒƒD]}|||ŽqoWXdS(N( R!RRRt preMethodtargstkwRR t postMethod(R)R*R(R+(RR(Rtnewfunc•s#( RRRRR,t func_namet TypeErrorR!tim_functoldfuncR RR (RRR0R,((RRRRs cCs‘t|t||ƒƒptdƒ‚nt||t|t||ƒƒƒt|t||ƒƒt|t ||ƒƒt|t||ƒƒdS(sH(private) causes a certain method name no longer to be hooked on a classsCannot unhook!N( RRRRRR R!tdelattrRR (RR((RR'©s"(RRt ExceptionRR R RRt hooked_funcRRRRRR RRR RR'(RRRRR3RRR'RR RR R RR RRR((Rt?$s$