3 uAc^@sldZddlZddlmZddgZGdddeZGdd d eZGd ddeeeZ Gd dde e Z dS) z[This module contains variants of certain base types which call registered hooks on changes.N)with_metaclassHookable HookableSetc@s eZdZddZeddZdS) HookableTypec Csd|kry |d}WnJtk r^d}x0dd|DD]}|rRtdt|q8|}q8WYnXx |dD]}tj||||<qjWtj||||S)N_hookable_change_methodsZ_hookable_base_classcss|]}|tkr|VqdS)N)r).0xr /usr/lib/python3.6/hookable.py )sz'HookableType.__new__..ztoo many base classes: %s)KeyError TypeErrorstrr wrap_methodtype__new__)clsnamebasesZdctbaseZbase_candidate methodnamer r r r"s zHookableType.__new__cs t||fdd}||_|S)Ncs|f||}|j|S)N) _run_hooks)selfpkZretval)funcr r methodwrapper9sz/HookableType.wrap_method..methodwrapper)getattr__name__)rrrrr )rr r5s  zHookableType.wrap_methodN)r __module__ __qualname__r classmethodrr r r r r src@s6eZdZd ddZddZddZdd Zd d ZdS) _HookEntryNc CsxFt|D]:\}}y t|Wq tk rBtd||fYq Xq WxF|jD]:\}}y t|WqRtk rtd||fYqRXqRWt|tst|}||_||_||_||_ d|_ dS)Nz*Positional argument %d is not hashable: %rz'Keyword argument %r is not hashable: %r) enumeratehashr items isinstancetuple_HookEntry__hook_HookEntry__args_HookEntry__kwargs_HookEntry__hookable_HookEntry__hash)rhookargskwargshookablenrrr r r __init__Ds*   z_HookEntry.__init__cCs$|j|jko"|j|jko"|j|jkS)N)r(r)r*)robjr r r __cmp__cs  z_HookEntry.__cmp__cCs|js|j|_|jS)N)r, _compute_hash)rr r r __hash__is z_HookEntry.__hash__cCs>t|j}t|t|jA}t|ttt|jjA}|S)N)r$r(r)r'sortedr*r%)r hashvaluer r r r5ns  z_HookEntry._compute_hashcCs4|jr |j|jf|j|jn|j|j|jdS)N)r+r(r)r*)rr r r runusz_HookEntry.run)N)rrr r2r4r6r5r9r r r r r"Bs  r"c@seZdZdZeddZddZddZeeeZdd Z d d Z ee e Z d d Z ddZ ddZddZddZddZddZdS)rz2An object which calls registered hooks on changes.cOst|dst|_|jS)N__real_hooks__)hasattrsetr:)rrrr r r __hooks__s zHookable.__hooks__cCst|dsd|_|jS)N__hooks_enabled__T)r;r>)rr r r _get_hooks_enableds zHookable._get_hooks_enabledcCs ||_dS)N)r>)rZenabledr r r _set_hooks_enabledszHookable._set_hooks_enabledcCst|dsd|_|jS)N__hooks_frozen__F)r;rA)rr r r _get_hooks_frozens zHookable._get_hooks_frozencCsB||jkrdS||_|r"t|_nx|jD] }|jq*W|`dS)N) hooks_frozenrAr<__hooks_frozen_entries__r9)rZfreeze hookentryr r r _set_hooks_frozens    zHookable._set_hooks_frozencCs d|_dS)NT)rC)rr r r freeze_hooksszHookable.freeze_hookscCs d|_dS)NF)rC)rr r r thaw_hooksszHookable.thaw_hookscOs|j|df||dS)N)_Hookable__add_hook)rr-r.r/r r r add_hookszHookable.add_hookcOs|j||f||dS)N)rI)rr-r.r/r r r add_hook_hookableszHookable.add_hook_hookablecOs t||||d}|jj|dS)N)r0)r"r=add)rr-Z _hookabler.r/rEr r r Z __add_hookszHookable.__add_hookcOs|jjt|||dS)N)r=remover")rr-r.r/r r r remove_hookszHookable.remove_hookcCs8|jr4|js&x&|jD] }|jqWn|jj|jdS)N) hooks_enabledrCr=r9rDupdate)rrEr r r rs  zHookable._run_hooksN)rrr __doc__propertyr=r?r@rOrBrFrCrGrHrJrKrIrNrr r r r r|s   c @seZdZdZdZd d Zd S)rz5A set object which calls registered hooks on changes.rLcleardifference_updatediscardintersection_updatepoprMsymmetric_difference_updaterPcCstj|}t|_|S)N)r<copyr:)rr3r r r rYs zHookableSet.copyN) rLrSrTrUrVrWrMrXrP)rrr rQrrYr r r r rs) rQ collectionsZsixr__all__rrobjectr"rr<rr r r r s ":G