R6�W� � @ s| d Z d d l m Z Gd d � d e � Z e � Z e � Z e � Z e � Z e � Z e � Z Gd d � d e � Z d S)z. Provide django-style hooks for model events. � )�Modelc @ sj e Z d Z d d � Z d d d d � Z d d d d � Z d d d d � Z d d � Z d d � Z d S)�Signalc C s | j � d S)N)�_flush)�self� r �/signals.py�__init__ s zSignal.__init__Nc C sX | p | j } | | j k rD | | f | j | <| j j | � n t d | � � d S)Nz#receiver named %s already connected)�__name__� _receivers�_receiver_list�append� ValueError)r �receiver�name�senderr r r �connect s zSignal.connectc C sB | r | j } | r2 | j | =| j j | � n t d � � d S)Nz%a receiver or a name must be provided)r r r �remover )r r r r r r � disconnect s zSignal.disconnectc s � � � f d d � } | S)Nc s � j | � � � | S)N)r )�fn)r r r r r � decorator s z"Signal.__call__.<locals>.decoratorr )r r r r r )r r r r �__call__ s zSignal.__call__c O sz t | � } g } xa | j D]V } | j | \ } } | d k sP t | | � r | j | | | | | | � f � q W| S)N)�typer r � isinstancer ) r �instance�args�kwargsr Z responsesr �r�sr r r �send"