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 Cst|tjstt|tstxFt|D]:\}}y t|Wq(tk r`td||fYq(Xq(WxF|jD]:\}}y t|Wqptk rtd||fYqpXqpWt|t st |}||_ ||_ ||_ ||_ d|_dS)Nz*Positional argument %d is not hashable: %rz'Keyword argument %r is not hashable: %r) isinstance collectionsCallableAssertionErrorr enumeratehashr itemstuple_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 r8ns  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 r5r7r9r8r<r 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>rA)rr r r _get_hooks_enableds zHookable._get_hooks_enabledcCs ||_dS)N)rA)rZenabledr r r _set_hooks_enabledszHookable._set_hooks_enabledcCst|dsd|_|jS)N__hooks_frozen__F)r>rD)rr r r _get_hooks_frozens zHookable._get_hooks_frozencCsB||jkrdS||_|r"t|_nx|jD] }|jq*W|`dS)N) hooks_frozenrDr?__hooks_frozen_entries__r<)rZfreeze hookentryr r r _set_hooks_frozens    zHookable._set_hooks_frozencCs d|_dS)NT)rF)rr r r freeze_hooksszHookable.freeze_hookscCs d|_dS)NF)rF)rr r r thaw_hooksszHookable.thaw_hookscOs|j|df||dS)N)_Hookable__add_hook)rr0r1r2r r r add_hookszHookable.add_hookcOs|j||f||dS)N)rL)rr0r1r2r r r add_hook_hookableszHookable.add_hook_hookablecOs>t|tjstt|tstt||||d}|jj|dS)N)r3)r#r$r%r&rr"r@add)rr0Z _hookabler1r2rHr r r Z __add_hookszHookable.__add_hookcOs|jjt|||dS)N)r@remover")rr0r1r2r r r remove_hookszHookable.remove_hookcCs8|jr4|js&x&|jD] }|jqWn|jj|jdS)N) hooks_enabledrFr@r<rGupdate)rrHr r r rs  zHookable._run_hooksN)rrr __doc__propertyr@rBrCrRrErIrFrJrKrMrNrLrQrr r r r r|s   c @seZdZdZdZd d Zd S)rz5A set object which calls registered hooks on changes.rOcleardifference_updatediscardintersection_updatepoprPsymmetric_difference_updaterScCstj|}t|_|S)N)r?copyr=)rr6r r r r\s zHookableSet.copyN) rOrVrWrXrYrZrPr[rS)rrr rTrr\r r r r rs) rTr$Zsixr__all__rrobjectr"rr?rr r r r s ":G