o
    nÄŽ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   úR/home/jeff/fluffinator/venv/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   Ú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   r5   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.Nr9   ©r   r   r   r	   r5   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   r:   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ÚEnumr8   Úlistr;   Údictr=   r>   )r   r   r   r	   r6   r7   r   r   r
   r   }   s   

zVisitor.visit)r   Ú
__module__Ú__qualname__r1   ÚweakrefÚ	ProxyTyper   Úclassmethodr   r   r!   r"   r+   r8   r2   r;   r=   r>   r   r   r   r   r
   r      s(    ü




r   )Ú__doc__rA   rG   Úobjectr   r   r   r   r
   Ú<module>   s    