B
    @\                 @   s   d Z ddlmZmZmZmZ ddlZeeZ	ddl
mZ ddlmZ ddlmZmZmZ dZG d	d
 d
eZG dd deZdddZdS )z Provides ``PropertyCallbackManager`` and ``EventCallbackManager``
mixin classes for adding ``on_change`` and ``on_event`` callback
interfaces to classes.
    )absolute_importdivisionprint_functionunicode_literalsN)string_types   )Event)get_param_infoformat_signature	signature)EventCallbackManagerPropertyCallbackManagerc                   s8   e Zd ZdZ fddZdd Zdd Zdd	 Z  ZS )
r   zs A mixin class to provide an interface for registering and
    triggering event callbacks on the Python side.

    c                s   t t| j|| t | _d S )N)superr   __init__dict_event_callbacks)selfargskw)	__class__ :lib/python3.7/site-packages/bokeh/util/callback_manager.pyr   3   s    zEventCallbackManager.__init__c             G   s   t |tst|tr|j}x|D ]}t|ddd q W || jkrVdd |D | j|< n| j| | || jkr|| j	| d S )N)eventzEvent callback)whatc             S   s   g | ]}|qS r   r   ).0cbr   r   r   
<listcomp>?   s    z1EventCallbackManager.on_event.<locals>.<listcomp>)

isinstancer   
issubclassr   
event_name_check_callbackr   extendZsubscribed_eventsappend)r   r   	callbackscallbackr   r   r   on_event7   s    


zEventCallbackManager.on_eventc             C   s<   x6| j |jg D ]"}|jd k	r| j|jkr|| qW d S )N)r   getr   Z	_model_idid)r   r   r$   r   r   r   _trigger_eventF   s    z#EventCallbackManager._trigger_eventc             C   s4   | j d krd S x | jD ]}| j j| |  qW d S )N)Zdocumentr   Z_subscribed_modelsadd)r   keyr   r   r   _update_event_callbacksK   s    
z,EventCallbackManager._update_event_callbacks)	__name__
__module____qualname____doc__r   r%   r(   r+   __classcell__r   r   )r   r   r   .   s
   r   c                   s:   e Zd ZdZ fddZdd Zdd Zdd	d
Z  ZS )r   zZ A mixin class to provide an interface for registering and
    triggering callbacks.

    c                s   t t| j|| t | _d S )N)r   r   r   r   
_callbacks)r   r   r   )r   r   r   r   Y   s    z PropertyCallbackManager.__init__c             G   sR   t |dkrtd| j|g }x*|D ]"}||kr6q(t|d || q(W dS )z Add a callback on this object to trigger when ``attr`` changes.

        Args:
            attr (str) : an attribute name on this object
            callback (callable) : a callback function to register

        Returns:
            None

        r   zSon_change takes an attribute name and one or more callbacks, got only one parameter)attroldnewN)len
ValueErrorr1   
setdefaultr    r"   )r   r2   r#   r1   r$   r   r   r   	on_change]   s    

z!PropertyCallbackManager.on_changec             G   s>   t |dkrtd| j|g }x|D ]}|| q(W dS )z$ Remove a callback from this object r   zZremove_on_change takes an attribute name and one or more callbacks, got only one parameterN)r5   r6   r1   r7   remove)r   r2   r#   r1   r$   r   r   r   remove_on_changeu   s
    
z(PropertyCallbackManager.remove_on_changeNc          	      sJ    fdd}t dr@jdk	r@j ||| n|  dS )z Trigger callbacks for ``attr`` on this object.

        Args:
            attr (str) :
            old (object) :
            new (object) :

        Returns:
            None

        c                 s.   j  } | r*x| D ]}|  qW d S )N)r1   r&   )r#   r$   )r2   r4   r3   r   r   r   invoke   s    
z/PropertyCallbackManager.trigger.<locals>.invoke	_documentN)hasattrr<   Z_notify_change)r   r2   r3   r4   Zhintsetterr;   r   )r2   r4   r3   r   r   trigger}   s    zPropertyCallbackManager.trigger)NN)	r,   r-   r.   r/   r   r8   r:   r?   r0   r   r   )r   r   r   S   s
   r   Callback functionsc             C   sV   t | }t|}|d }t|\}}t|t| t|krRt|d||f dS )z3Bokeh-internal function to check callback signaturez) must have signature func(%s), got func%sz, N)r   r
   r	   r5   r6   join)r$   Zfargsr   ZsigZformatted_argsZ	error_msgZ	all_namesZdefault_valuesr   r   r   r       s    r    )r@   )r/   Z
__future__r   r   r   r   ZloggingZ	getLoggerr,   logZsixr   Zeventsr   Zutil.futurer	   r
   r   __all__objectr   r   r    r   r   r   r   <module>
   s   
	%H