U � �Q$ � @ s� d Z ddlZddlZddlZddlZze W n ek rH dd� ZY nX ejdk rje�d�Z e�d�Z ne�d�Z e�d �Z dd d�ZG dd � d e�Z dS )z-Refactored 'safe reference from dispatcher.py� Nc C s t | d�S )N�__call__)�hasattr)�object� r �/_saferef.py�callable. s r )� �im_self�im_func�__self__�__func__c C s� zt | �}W n: tk rF t|�r4t�| |� Y S t�| � Y S Y n:X |dk r�t| d�spt| d�sptd| ��t| |d�}|S dS )a� Return a *safe* weak reference to a callable target. - ``target``: The object to be weakly referenced, if it's a bound method reference, will create a BoundMethodWeakref, otherwise creates a simple weakref. - ``on_delete``: If provided, will have a hard reference stored to the callable to be called after the safe reference goes out of scope with the reference object, (either a weakref or a BoundMethodWeakref) as argument. Nr r zRsafe_ref target %r has im_self, but no im_func, don't know how to create reference)�target� on_delete)�get_self�AttributeErrorr �weakref�refr �AssertionError�BoundMethodWeakref)r r r Z referencer r r �safe_ref: s ��r c sh e Zd ZdZe�� Zd� fdd� Zddd�Zdd� Z e e �Z d d � ZeZdd� Z d d� Zdd� Z� ZS )r a� 'Safe' and reusable weak references to instance methods. BoundMethodWeakref objects provide a mechanism for referencing a bound method without requiring that the method object itself (which is normally a transient object) is kept alive. Instead, the BoundMethodWeakref object keeps weak references to both the object and the function which together define the instance method. Attributes: - ``key``: The identity key for the reference, calculated by the class's calculate_key method applied to the target instance method. - ``deletion_methods``: Sequence of callable objects taking single argument, a reference to this object which will be called when *either* the target object or target function is garbage collected (i.e. when this object becomes invalid). These are specified as the on_delete parameters of safe_ref calls. - ``weak_self``: Weak reference to the target object. - ``weak_func``: Weak reference to the target function. Class Attributes: - ``_all_instances``: Class attribute pointing to all live BoundMethodWeakref objects indexed by the class's calculate_key(target) method applied to the target objects. This weak value dictionary is used to short-circuit creation so that multiple references to the same (object, function) pair produce the same BoundMethodWeakref instance. Nc sd | � |�}| j�|�}|dk r.|j�|� |S tt| ��| �}|| j|<