a
    Ò�éi%  ã                   @   s¤   d dl mZ d dlmZ d dlmZmZmZmZ d dl	m
Z
 eG dd„ dƒƒZG dd„ dƒZeƒ Zeeegef d	œd
d„Zdd„ Zeded�Zeedœdd„ZdS )é    )Ú	dataclass©Úwraps)ÚCallableÚListÚTypeÚTypeVar)ÚEventEmitterc                   @   s   e Zd ZU eed< eed< dS )ÚHandlerÚeventÚmethodN)Ú__name__Ú
__module__Ú__qualname__ÚstrÚ__annotations__r   © r   r   ú8/home/Claro/venv/lib/python3.9/site-packages/pyee/cls.pyr
      s   
r
   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚHandlersc                 C   s
   g | _ d S ©N©Ú	_handlers©Úselfr   r   r   Ú__init__   s    zHandlers.__init__c                 C   s   | j  |¡ d S r   )r   Úappend)r   Úhandlerr   r   r   r      s    zHandlers.appendc                 C   s
   t | jƒS r   )Úiterr   r   r   r   r   Ú__iter__   s    zHandlers.__iter__c                 C   s
   g | _ d S r   r   r   r   r   r   Úreset   s    zHandlers.resetN)r   r   r   r   r   r   r   r   r   r   r   r      s   r   )r   Úreturnc                    s   t t dœ‡ fdd„}|S )zr
    Register an event handler on an evented class. See the `evented` class
    decorator for a full example.
    )r   r    c                    s   t  tˆ | d�¡ | S )N)r   r   )r   r   r
   )r   ©r   r   r   Ú	decorator%   s    zon.<locals>.decorator)r   )r   r"   r   r!   r   Úon   s    r#   c                    s   t ˆ ƒ‡ ‡fdd„ƒ}|S )Nc                     s   ˆ ˆg| ¢R i |¤ŽS r   r   )ÚargsÚkwargs©r   r   r   r   Úbound-   s    z_bind.<locals>.boundr   )r   r   r'   r   r&   r   Ú_bind,   s    r(   ÚCls)r'   )Úclsr    c                    s8   t tƒ‰ t ¡  | j‰t| jƒ‡ ‡fdd„ƒ}|| _| S )aQ  
    Configure an evented class.

    Evented classes are classes which use an EventEmitter to call instance
    methods during runtime. To achieve this without this helper, you would
    instantiate an `EventEmitter` in the `__init__` method and then call
    `event_emitter.on` for every method on `self`.

    This decorator and the `on` function help make things look a little nicer
    by defining the event handler on the method in the class and then adding
    the `__init__` hook in a wrapper:

    ```py
    from pyee.cls import evented, on

    @evented
    class Evented:
        @on("event")
        def event_handler(self, *args, **kwargs):
            print(self, args, kwargs)

    evented_obj = Evented()

    evented_obj.event_emitter.emit(
        "event", "hello world", numbers=[1, 2, 3]
    )
    ```

    The `__init__` wrapper will create a `self.event_emitter: EventEmitter`
    automatically but you can also define your own event_emitter inside your
    class's unwrapped `__init__` method. For example, to use this
    decorator with a `TwistedEventEmitter`::

    ```py
    @evented
    class Evented:
        def __init__(self):
            self.event_emitter = TwistedEventEmitter()

        @on("event")
        async def event_handler(self, *args, **kwargs):
            await self.some_async_action(*args, **kwargs)
    ```
    c                    sN   ˆ| g|¢R i |¤Ž t | dƒs(tƒ | _ˆ D ]}| j |jt| |jƒ¡ q,d S )NÚevent_emitter)Úhasattrr	   r+   r#   r   r(   r   )r   r$   r%   Úh©ÚhandlersZog_initr   r   Úiniti   s
    
zevented.<locals>.init)Úlistr   r   r   r   )r*   r0   r   r.   r   Úevented7   s    -r2   N)Zdataclassesr   Ú	functoolsr   Útypingr   r   r   r   Zpyeer	   r
   r   r   r   r#   r(   r)   r2   r   r   r   r   Ú<module>   s   