9Qc@sqdZddgZdefdYZdefdYZdefdYZdeefdYZd S( s[This module contains variants of certain base types which call registered hooks on changes.tHookablet HookableSett HookableTypecBs eZdZedZRS(cCs|jdry|d}WnYtk rxd}xCtd|D]+}|rktdt|qF|}qFWnXx+|dD]}tj||||$sstoo many base classes: %s( thas_keytKeyErrortNonetfiltert TypeErrortstrRt wrap_methodttypet__new__(tclstnametbasestdcttbasetbase_candidatet methodname((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyRs cs+t||fd}||_|S(Ncs |||}|j|S(N(t _run_hooks(tselftptktretval(tfunc(s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyt methodwrapper4s (tgetattrt func_name(RRRR((Rs6/usr/lib/python2.7/site-packages/slip/util/hookable.pyR 0s (t__name__t __module__Rt classmethodR (((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyRs t _HookEntrycBs,eZdZdZdZdZRS(cCs||_||_||_dS(N(t_HookEntry__hookt_HookEntry__argst_HookEntry__kwargs(Rthooktargstkwargs((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyt__init__?s  cCs4|j|jko3|j|jko3|j|jkS(N(R$R%R&(Rtobj((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyt__cmp__Es$cCs-|jj|jjA|jjjAS(N(R$t__hash__R%R&t iteritems(R((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyR-IscCs|j|j|jdS(N(R$R%R&(R((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pytrunMs(R R!R*R,R-R/(((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyR#=s   cBseZdZeZedZdZdZeeeZ dZ dZ ee e Z dZ dZdZd Zd ZRS( s2An object which calls registered hooks on changes.cOs%t|dst|_n|jS(Nt__real_hooks__(thasattrtsetR0(RRR((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyt __hooks__WscCs"t|dst|_n|jS(Nt__hooks_enabled__(R1tTrueR4(R((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyt_get_hooks_enabled]s cCs ||_dS(N(R4(Rtenabled((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyt_set_hooks_enabledbscCs"t|dst|_n|jS(Nt__hooks_frozen__(R1tFalseR9(R((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyt_get_hooks_frozengs cCsY||jkrdS||_|r1t|_n$x|jD]}|jq;W|`dS(N(t hooks_frozenR9R2t__hooks_frozen_entries__R/(Rtfreezet hookentry((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyt_set_hooks_frozenls cCs t|_dS(N(R5R<(R((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyt freeze_hooks{scCs t|_dS(N(R:R<(R((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyt thaw_hooks~scOs8t|stt|||}|jj|dS(N(tcallabletAssertionErrorR#R3tadd(RR'R(R)R?((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pytadd_hookscOs |jjt|||dS(N(R3tremoveR#(RR'R(R)((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyt remove_hookscCsM|jrI|js3x1|jD]}|jqWqI|jj|jndS(N(t hooks_enabledR<R3R/R=tupdate(RR?((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyRs   (R R!t__doc__Rt __metaclass__tpropertyR3R6R8RIR;R@R<RARBRFRHR(((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyRQs        c BseZdZd Zd ZRS( s5A set object which calls registered hooks on changes.REtcleartdifference_updatetdiscardtintersection_updatetpopRGtsymmetric_difference_updateRJcCstj|}t|_|S(N(R2tcopyR0(RR+((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyRTs ( saddsclearsdifference_updatesdiscardsintersection_updatespopsremovessymmetric_difference_updatesupdate(R R!RKRRT(((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyRs N( RKt__all__RRtobjectR#RR2R(((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyts  "C