U
    h	                     @   sR   d Z ddlmZ G dd deZe Ze Ze Ze Z	e Z
G dd deZdS )z.
Provide django-style hooks for model events.
    )Modelc                   @   sB   e Zd Zdd Zdd ZdddZddd	Zdd
dZdd ZdS )Signalc                 C   s   |    d S N)_flushself r   5/tmp/pip-unpacked-wheel-5j60pwdk/playhouse/signals.py__init__   s    zSignal.__init__c                 C   s   t  | _g | _d S r   )set
_receivers_receiver_listr   r   r   r	   r      s    zSignal._flushNc                 C   sT   |p|j }||f}|| jkr<| j| | j|||f ntd||pHdf d S )Nz3receiver named %s (for sender=%s) already connectedany)__name__r   addr   append
ValueError)r   receivernamesenderkeyr   r   r	   connect   s    


zSignal.connectc                    sf   |r|p|j }|std||f  | jkr@td||p8df | j   fdd| jD | _d S )Nz%a receiver or a name must be providedz*receiver named %s for sender=%s not found.r   c                    s(   g | ] \}}}||f kr|||fqS r   r   ).0nrsr   r   r	   
<listcomp>%   s    z%Signal.disconnect.<locals>.<listcomp>)r   r   r   remover   )r   r   r   r   r   r   r	   
disconnect   s    


zSignal.disconnectc                    s    fdd}|S )Nc                    s    |   | S r   )r   )fnr   r   r   r   r	   	decorator)   s    z"Signal.__call__.<locals>.decoratorr   )r   r   r   r"   r   r!   r	   __call__(   s    zSignal.__call__c           	      O   sP   t |}g }| jD ]8\}}}|d ks.t||r|||||f||f q|S r   )typer   
isinstancer   )	r   instanceargskwargsr   	responsesr   r   r   r   r   r	   send.   s    zSignal.send)NN)NNN)NN)	r   
__module____qualname__r
   r   r   r   r#   r*   r   r   r   r	   r      s   



r   c                       s4   e Zd Z fddZ fddZ fddZ  ZS )r   c                    s    t t| j|| t|  d S r   )superr   r
   pre_initr*   )r   r'   r(   	__class__r   r	   r
   ?   s    zModel.__init__c                    sZ   | j jr| jnd}|ddp&t| }tj| |d tt| j	||}t
j| |d |S )NTZforce_insertF)created)Z_metaZprimary_keyZ_pkgetboolpre_saver*   r-   r   save	post_save)r   r'   r(   Zpk_valuer1   retr/   r   r	   r5   C   s    z
Model.savec                    s*   t |  tt| j||}t|  |S r   )
pre_deleter*   r-   r   delete_instancepost_delete)r   r'   r(   r7   r/   r   r	   r9   K   s    

zModel.delete_instance)r   r+   r,   r
   r5   r9   __classcell__r   r   r/   r	   r   >   s   r   N)__doc__Zpeeweer   Z_Modelobjectr   r4   r6   r8   r:   r.   r   r   r   r	   <module>   s   0