σ
mάJ]c           @` sΚ   d  Z  d d l m Z m Z m Z m Z d d l Z e j e  Z	 d d l
 m Z d d l m Z d d l m Z m Z m Z d Z d
 e f d     YZ d e f d     YZ d   Z d d  Z d S(   u    Provides ``PropertyCallbackManager`` and ``EventCallbackManager``
mixin classes for adding ``on_change`` and ``on_event`` callback
interfaces to classes.
i    (   t   absolute_importt   divisiont   print_functiont   unicode_literalsN(   t   string_typesi   (   t   Event(   t   get_param_infot   format_signaturet	   signatureu   EventCallbackManageru   PropertyCallbackManagert   EventCallbackManagerc           B` s2   e  Z d  Z d   Z d   Z d   Z d   Z RS(   us    A mixin class to provide an interface for registering and
    triggering event callbacks on the Python side.

    c         O` s)   t  t |   j | |   t   |  _ d  S(   N(   t   superR	   t   __init__t   dictt   _event_callbacks(   t   selft   argst   kw(    (    s:   lib/python2.7/site-packages/bokeh/util/callback_manager.pyR   3   s    c         G` sΠ   t  | t  r+ t | t  r+ | j } n  x6 | D]. } t |  d k r2 t | d d d q2 q2 W| |  j k r g  | D] } | ^ qz |  j | <n |  j | j |  | |  j	 k rΜ |  j	 j
 |  n  d  S(   Ni    u   eventt   whatu   Event callback(   u   event(   t
   isinstanceR   t
   issubclassR   t
   event_namet   _nargst   _check_callbackR   t   extendt   subscribed_eventst   append(   R   t   eventt	   callbackst   callbackt   cb(    (    s:   lib/python2.7/site-packages/bokeh/util/callback_manager.pyt   on_event7   s    #c         ` sN      f d   } t   d  rC  j d  k	 rC  j j |  n |   d  S(   Nc          ` sq   xj  j  j   j g   D]P }    j d  k	 r  j   j k r t |   d k r\ |    qi |     q q Wd  S(   Ni    (   R   t   getR   t	   _model_idt   Nonet   idR   (   R   (   R   R   (    s:   lib/python2.7/site-packages/bokeh/util/callback_manager.pyt   invokeH   s
    !
u	   _document(   t   hasattrt	   _documentR!   t   _with_self_as_curdoc(   R   R   R#   (    (   R   R   s:   lib/python2.7/site-packages/bokeh/util/callback_manager.pyt   _trigger_eventG   s    c         C` sB   |  j  d  k r d  Sx( |  j D] } |  j  j | j |   q Wd  S(   N(   t   documentR!   R   t   _subscribed_modelst   add(   R   t   key(    (    s:   lib/python2.7/site-packages/bokeh/util/callback_manager.pyt   _update_event_callbacks]   s    (   t   __name__t
   __module__t   __doc__R   R   R'   R,   (    (    (    s:   lib/python2.7/site-packages/bokeh/util/callback_manager.pyR	   .   s
   			t   PropertyCallbackManagerc           B` s8   e  Z d  Z d   Z d   Z d   Z d d d  Z RS(   uZ    A mixin class to provide an interface for registering and
    triggering callbacks.

    c         O` s)   t  t |   j | |   t   |  _ d  S(   N(   R
   R0   R   R   t
   _callbacks(   R   R   R   (    (    s:   lib/python2.7/site-packages/bokeh/util/callback_manager.pyR   k   s    c         G` sw   t  |  d k r! t d   n  |  j j | g   } x: | D]2 } | | k rU q= n  t | d  | j |  q= Wd S(   uψ    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

        i    uS   on_change takes an attribute name and one or more callbacks, got only one parameteru   attru   oldu   newN(   u   attru   oldu   new(   t   lent
   ValueErrorR1   t
   setdefaultR   R   (   R   t   attrR   R1   R   (    (    s:   lib/python2.7/site-packages/bokeh/util/callback_manager.pyt	   on_changeo   s    c         G` sX   t  |  d k r! t d   n  |  j j | g   } x | D] } | j |  q= Wd S(   u$    Remove a callback from this object i    uZ   remove_on_change takes an attribute name and one or more callbacks, got only one parameterN(   R2   R3   R1   R4   t   remove(   R   R5   R   R1   R   (    (    s:   lib/python2.7/site-packages/bokeh/util/callback_manager.pyt   remove_on_change   s
    c         ` sf        f d   } t   d  r[  j d k	 r[  j j      | | |  n |   d S(   uΊ    Trigger callbacks for ``attr`` on this object.

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

        Returns:
            None

        c          ` s@    j  j    }  |  r< x! |  D] } |      q Wn  d  S(   N(   R1   R   (   R   R   (   R5   t   newt   oldR   (    s:   lib/python2.7/site-packages/bokeh/util/callback_manager.pyR#      s    u	   _documentN(   R$   R%   R!   t   _notify_change(   R   R5   R:   R9   t   hintt   setterR#   (    (   R5   R9   R:   R   s:   lib/python2.7/site-packages/bokeh/util/callback_manager.pyt   trigger   s    %N(   R-   R.   R/   R   R6   R8   R!   R>   (    (    (    s:   lib/python2.7/site-packages/bokeh/util/callback_manager.pyR0   e   s
   			c         C` s2   t  |   } t |  \ } } t |  t |  S(   N(   R   R   R2   (   t   fnt   sigt	   all_namest   default_values(    (    s:   lib/python2.7/site-packages/bokeh/util/callback_manager.pyR   ­   s    u   Callback functionsc   	      C` s   t  |   } t |  } | d } t |  \ } } t |  t |  } | t |  k r~ t | d j |  | f   n  d S(   u3   Bokeh-internal function to check callback signatureu)    must have signature func(%s), got func%su   , N(   R   R   R   R2   R3   t   join(	   R   t   fargsR   R@   t   formatted_argst	   error_msgRA   RB   t   nargs(    (    s:   lib/python2.7/site-packages/bokeh/util/callback_manager.pyR   ²   s    
(   u   EventCallbackManageru   PropertyCallbackManager(   R/   t
   __future__R    R   R   R   t   loggingt	   getLoggerR-   t   logt   sixR   t   eventsR   t   util.futureR   R   R   t   __all__t   objectR	   R0   R   R   (    (    (    s:   lib/python2.7/site-packages/bokeh/util/callback_manager.pyt   <module>
   s   "	 7H	