
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
ˆuAc^  ã               @   sl   d Z ddlZddlmZ ddgZG dd„ deƒZG dd	„ d	eƒZG d
d„ deeeƒƒZ	G dd„ de
e	ƒZdS )z[This module contains variants of certain base types which call registered
hooks on changes.é    N)Úwith_metaclassÚHookableÚHookableSetc               @   s    e Zd Zdd„ Zedd„ ƒZdS )ÚHookableTypec             C   s’   d|kr‚y|d }W nJ t k
r^   d }x0dd„ |D ƒD ]}|rRtdt|ƒ ƒ‚q8|}q8W Y nX x |d D ]}tj||ƒ||< qjW tj| |||ƒS )NÚ_hookable_change_methodsZ_hookable_base_classc             s   s   | ]}|t kr|V  qd S )N)r   )Ú.0Úx© r	   ú/usr/lib/python3.6/hookable.pyú	<genexpr>)   s    z'HookableType.__new__.<locals>.<genexpr>ztoo many base classes: %s)ÚKeyErrorÚ	TypeErrorÚstrr   Úwrap_methodÚtypeÚ__new__)ÚclsÚnameÚbasesZdctÚbaseZbase_candidateÚ
methodnamer	   r	   r
   r   "   s    zHookableType.__new__c                s    t ||ƒ‰ ‡ fdd„}||_|S )Nc                s   ˆ | f|ž|Ž}| j ƒ  |S )N)Ú
_run_hooks)ÚselfÚpÚkZretval)Úfuncr	   r
   Úmethodwrapper9   s    z/HookableType.wrap_method.<locals>.methodwrapper)ÚgetattrÚ__name__)r   r   r   r   r	   )r   r
   r   5   s    
zHookableType.wrap_methodN)r   Ú
__module__Ú__qualname__r   Úclassmethodr   r	   r	   r	   r
   r       s   r   c               @   s6   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )Ú
_HookEntryNc             C   sâ   t |tjƒst‚t |tƒst‚xFt|ƒD ]:\}}yt|ƒ W q( tk
r`   td||f ƒ‚Y q(X q(W xF|jƒ D ]:\}}yt|ƒ W qp tk
r¨   td||f ƒ‚Y qpX qpW t |t	ƒsÀt	|ƒ}|| _
|| _|| _|| _d | _d S )Nz*Positional argument %d is not hashable: %rz'Keyword argument %r is not hashable: %r)Ú
isinstanceÚcollectionsÚCallableÚAssertionErrorr   Ú	enumerateÚhashr   ÚitemsÚtupleÚ_HookEntry__hookÚ_HookEntry__argsÚ_HookEntry__kwargsÚ_HookEntry__hookableÚ_HookEntry__hash)r   ÚhookÚargsÚkwargsÚhookableÚnr   r   r	   r	   r
   Ú__init__D   s.    
z_HookEntry.__init__c             C   s$   | j |j ko"| j|jko"| j|jkS )N)r+   r,   r-   )r   Úobjr	   r	   r
   Ú__cmp__c   s    z_HookEntry.__cmp__c             C   s   | j s| jƒ | _ | j S )N)r/   Ú_compute_hash)r   r	   r	   r
   Ú__hash__i   s    
z_HookEntry.__hash__c             C   s>   t | jƒ}t |ƒt | jƒA }t |ƒt tt| jjƒ ƒƒƒA }|S )N)r(   r+   r,   r*   Úsortedr-   r)   )r   Ú	hashvaluer	   r	   r
   r8   n   s
    
z_HookEntry._compute_hashc             C   s4   | j r | j| j f| jž| jŽ n| j| j| jŽ d S )N)r.   r+   r,   r-   )r   r	   r	   r
   Úrunu   s    z_HookEntry.run)N)r   r   r    r5   r7   r9   r8   r<   r	   r	   r	   r
   r"   B   s
   
r"   c               @   sˆ   e Zd ZdZedd„ ƒZdd„ Zdd„ ZeeeƒZdd	„ Z	d
d„ Z
ee	e
ƒZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )r   z2An object which calls registered hooks on changes.c             O   s   t | dƒstƒ | _| jS )NÚ__real_hooks__)ÚhasattrÚsetr=   )r   r   r   r	   r	   r
   Ú	__hooks__€   s    
zHookable.__hooks__c             C   s   t | dƒsd| _| jS )NÚ__hooks_enabled__T)r>   rA   )r   r	   r	   r
   Ú_get_hooks_enabled†   s    
zHookable._get_hooks_enabledc             C   s
   || _ d S )N)rA   )r   Zenabledr	   r	   r
   Ú_set_hooks_enabled‹   s    zHookable._set_hooks_enabledc             C   s   t | dƒsd| _| jS )NÚ__hooks_frozen__F)r>   rD   )r   r	   r	   r
   Ú_get_hooks_frozen�   s    
zHookable._get_hooks_frozenc             C   sB   || j krd S || _|r"tƒ | _nx| jD ]}|jƒ  q*W | `d S )N)Úhooks_frozenrD   r?   Ú__hooks_frozen_entries__r<   )r   ZfreezeÚ	hookentryr	   r	   r
   Ú_set_hooks_frozen•   s    

zHookable._set_hooks_frozenc             C   s
   d| _ d S )NT)rF   )r   r	   r	   r
   Úfreeze_hooks¤   s    zHookable.freeze_hooksc             C   s
   d| _ d S )NF)rF   )r   r	   r	   r
   Ú
thaw_hooks§   s    zHookable.thaw_hooksc             O   s   | j |d f|ž|Ž d S )N)Ú_Hookable__add_hook)r   r0   r1   r2   r	   r	   r
   Úadd_hookª   s    zHookable.add_hookc             O   s   | j || f|ž|Ž d S )N)rL   )r   r0   r1   r2   r	   r	   r
   Úadd_hook_hookable­   s    zHookable.add_hook_hookablec             O   s>   t |tjƒst‚t |tƒst‚t||||d�}| jj|ƒ d S )N)r3   )r#   r$   r%   r&   r   r"   r@   Úadd)r   r0   Z	_hookabler1   r2   rH   r	   r	   r
   Z
__add_hook°   s    zHookable.__add_hookc             O   s   | j jt|||ƒƒ d S )N)r@   Úremover"   )r   r0   r1   r2   r	   r	   r
   Úremove_hook¶   s    zHookable.remove_hookc             C   s8   | j r4| js&x&| jD ]}|jƒ  qW n| jj| jƒ d S )N)Úhooks_enabledrF   r@   r<   rG   Úupdate)r   rH   r	   r	   r
   r   º   s
    zHookable._run_hooksN)r   r   r    Ú__doc__Úpropertyr@   rB   rC   rR   rE   rI   rF   rJ   rK   rM   rN   rL   rQ   r   r	   r	   r	   r
   r   |   s   

c            	   @   s   e Zd ZdZdZdd„ ZdS )r   z5A set object which calls registered hooks on changes.rO   ÚclearÚdifference_updateÚdiscardÚintersection_updateÚpoprP   Úsymmetric_difference_updaterS   c             C   s   t j| ƒ}t ƒ |_|S )N)r?   Úcopyr=   )r   r6   r	   r	   r
   r\   Ë   s    
zHookableSet.copyN)	rO   rV   rW   rX   rY   rZ   rP   r[   rS   )r   r   r    rT   r   r\   r	   r	   r	   r
   r   Ã   s    )rT   r$   Zsixr   Ú__all__r   r   Úobjectr"   r   r?   r   r	   r	   r	   r
   Ú<module>   s   ":G