o
    iz                     @   s(   d Z ddlZddlZG dd deZdS )z:Generic visitor pattern implementation for Python objects.    Nc                   @   s   e Zd ZdZejddd iiZedd Zedd Z	ed	d
 Z
edd Zei fddZdd Zdd Zdd Zdd Zdd Zdd ZdS )VisitorFNc                 O      dS )NF selfobjargskwargsr   r   e/var/www/html/eduruby.in/lip-sync/lip-sync-env/lib/python3.10/site-packages/fontTools/misc/visitor.py<lambda>   s    zVisitor.<lambda>c                    s2    t ksJ dd jvri  _ fdd}|S )NzSubclass Visitor instead.	_visitorsc                    s   | j dksJ D ]8\}}t|tkr|f}t|tkr|f}|D ]} j|i }|D ]}||vs;J d|j |f | ||< q,q!q	d S )Nvisitz?Oops, class '%s' has visitor function for '%s' defined already.)__name__typetuplestrr   
setdefault)methodclazzesattrsclazzr   attrcelfclazzes_attrsr   r
   wrapper   s$   

z"Visitor._register.<locals>.wrapper)r   __dict__r   )r   r   r   r   r   r
   	_register   s
   
zVisitor._registerc                 C   s"   t |tkr	|f}| |dfgS )NN)r   r   r   )r   r   r   r   r
   register*   s   zVisitor.registerc                 C   sJ   g }t |tkr|f}t |tkr|f}|D ]	}|||f q| |S r   )r   r   r   appendr   )r   r   r   r   r   r   r   r
   register_attr0   s   
zVisitor.register_attrc                 C   s
   |  |S r   )r   r   r   r   r
   register_attrs;   s   
zVisitor.register_attrsc                 C   sd   t |}|  D ]'} t| dd }|d u r |S | D ]}| j|d }|d ur.|    S qq|S )Nr   )r   mrogetattrr   get)r   thing_defaulttypr   basemr   r   r
   _visitorsFor?   s   zVisitor._visitorsForc                 O   s   t t| }| |}|dd}|D ]@}|d dkrqt||}|||}	|	durG|	| |||g|R i |}
|
dksF|
du rG| jrGq| j|||g|R i | qdS )a  Called to visit an object. This function loops over all non-private
        attributes of the objects and calls any user-registered (via
        ``@register_attr()`` or ``@register_attrs()``) ``visit()`` functions.

        The visitor will proceed to call ``self.visitAttr()``, unless there is a
        user-registered visit function and:

        * It returns ``False``; or
        * It returns ``None`` (or doesn't return anything) and
          ``visitor.defaultStop`` is ``True`` (non-default).
        *Nr   _F)sortedvarskeysr+   r%   r$   defaultStop	visitAttr)r   r   r   r	   r0   r   ZdefaultVisitorkeyvaluevisitorFuncretr   r   r
   visitObjectO   s   

zVisitor.visitObjectc                 O   s   | j |g|R i | dS )z*Called to visit an attribute of an object.Nr   )r   r   r   r4   r   r	   r   r   r
   r2   j   s   zVisitor.visitAttrc                 O   s&   |D ]}| j |g|R i | qdS )z)Called to visit any value that is a list.Nr8   r   r   r   r	   r4   r   r   r
   	visitListn   s   zVisitor.visitListc                 O   s*   |  D ]}| j|g|R i | qdS )z/Called to visit any value that is a dictionary.N)valuesr   r9   r   r   r
   	visitDicts   s   zVisitor.visitDictc                 O   r   )zMCalled to visit any value that is not an object, list,
        or dictionary.Nr   r   r   r   r
   	visitLeafx   s   zVisitor.visitLeafc                 O   s   |  |dd}|dur&|| |g|R i |}|dks$|du r&| jr&dS t|dr?t|tjs?| j|g|R i | dS t|trR| j	|g|R i | dS t|t
re| j|g|R i | dS | j|g|R i | dS )aG  This is the main entry to the visitor. The visitor will visit object
        ``obj``.

        The visitor will first determine if there is a registered (via
        ``@register()``) visit function for the type of object. If there is, it
        will be called, and ``(visitor, obj, *args, **kwargs)`` will be passed
        to the user visit function.

        The visitor will not recurse if there is a user-registered visit
        function and:

        * It returns ``False``; or
        * It returns ``None`` (or doesn't return anything) and
          ``visitor.defaultStop`` is ``True`` (non-default)

        Otherwise,  the visitor will proceed to dispatch to one of
        ``self.visitObject()``, ``self.visitList()``, ``self.visitDict()``, or
        ``self.visitLeaf()`` (any of which can be overriden in a subclass).
        NFr   )r+   r%   r1   hasattr
isinstanceenumEnumr7   listr:   dictr<   r=   )r   r   r   r	   r5   r6   r   r   r
   r   }   s   

zVisitor.visit)r   
__module____qualname__r1   weakref	ProxyTyper   classmethodr   r   r!   r"   r+   r7   r2   r:   r<   r=   r   r   r   r   r
   r      s(    




r   )__doc__r@   rF   objectr   r   r   r   r
   <module>   s    