
     iz                     6    d Z ddlZddlZ G d de          ZdS )z:Generic visitor pattern implementation for Python objects.    Nc                       e Zd ZdZej        dd iiZed             Zed             Z	ed             Z
ed             Zei fd            Zd	 Zd
 Zd Zd Zd Zd ZdS )VisitorFNc                     dS )NF selfobjargskwargss       `/srv/www/vhosts/g4struct/public_html/venv/lib/python3.11/site-packages/fontTools/misc/visitor.py<lambda>zVisitor.<lambda>   s    U     c                 `      t           k    s
J d            d j        vri  _         fd}|S )NzSubclass Visitor instead.	_visitorsc           	      &   | j         dk    sJ D ]\  }}t          |          t          k    r|f}t          |          t          k    r|f}|D ]A}j                            |i           }|D ]!}||vsJ d|j         d|d            | ||<   "Bd S )NvisitzOops, class 'z' has visitor function for 'z' defined already.)__name__typetuplestrr   
setdefault)methodclazzesattrsclazzr   attrcelfclazzes_attrss         r   wrapperz"Visitor._register.<locals>.wrapper   s    ?g----"/ 1 1==E))&jG;;#%%"HE$ 1 1E $ 9 9% D DI % 1 1#94444$~~~ttt5  544 +1	$11 4r   )r   __dict__r   )r   r   r   s   `` r   	_registerzVisitor._register   sQ    w ;dm++DN	 	 	 	 	 	" r   c                 h    t          |          t          k    r|f}|                     |dfg          S )NN)r   r   r!   )r   r   s     r   registerzVisitor.register*   s4    ==E!!jG~~12333r   c                     g }t          |          t          k    r|f}t          |          t          k    r|f}|D ]}|                    ||f           |                     |          S r#   )r   r   r   appendr!   )r   r   r   r   r   s        r   register_attrzVisitor.register_attr0   ss    ==E!!jG;;#HE 	1 	1E  %0000~~m,,,r   c                 ,    |                      |          S r#   )r!   )r   r   s     r   register_attrszVisitor.register_attrs;   s    ~~m,,,r   c                     t          |          }|                                 D ]Q} t          | dd           }| n;|                                D ]%}| j                            |d           }||c c S &R|S )Nr   )r   mrogetattrr   get)r   thing_defaulttypr   basems          r   _visitorsForzVisitor._visitorsFor?   s    5kkHHJJ 	 	Dk488I 		  N&&tT22=HHHHH !
 r   c                    t          t          |                                                    }|                     |          }|                    dd          }|D ]i}|d         dk    rt          ||          }|                    ||          }	|	 |	| |||g|R i |}
|
dk    s	|
| j        rV | j        |||g|R i | jd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keysr3   r-   r,   defaultStop	visitAttr)r   r	   r
   r   r9   r   defaultVisitorkeyvaluevisitorFuncrets              r   visitObjectzVisitor.visitObjectO   s     d3iinn&&''%%c**	"sD11 		= 		=C1v}}C%%E#--^<<K&!k$S%I$III&II%<<CKD4DKDN3U<T<<<V<<<<		= 		=r   c                 (     | j         |g|R i | dS )z*Called to visit an attribute of an object.Nr   )r   r	   r   r>   r
   r   s         r   r;   zVisitor.visitAttrj   s*    
5*4***6*****r   c                 2    |D ]} | j         |g|R i | dS )z)Called to visit any value that is a list.NrC   r   r	   r
   r   r>   s        r   	visitListzVisitor.visitListn   s@     	/ 	/EDJu.t...v....	/ 	/r   c                 V    |                                 D ]} | j        |g|R i | dS )z/Called to visit any value that is a dictionary.N)valuesr   rE   s        r   	visitDictzVisitor.visitDicts   sH    ZZ\\ 	/ 	/EDJu.t...v....	/ 	/r   c                     dS )zMCalled to visit any value that is not an object, list,
        or dictionary.Nr   r   s       r   	visitLeafzVisitor.visitLeafx   s	     	r   c                    |                      |                              dd          }| || |g|R i |}|dk    s	|	| j        rdS t          |d          r-t	          |t
          j                  s | j        |g|R i | dS t	          |t                    r | j	        |g|R i | dS t	          |t                    r | 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    )r3   r-   r:   hasattr
isinstanceenumEnumrA   listrF   dictrI   rK   )r   r	   r
   r   r?   r@   s         r   r   zVisitor.visit}   sQ   * '',,00t<<"+dC9$999&99Ce||0@3
## 	1JsDI,F,F 	1DS24222622222T"" 	1DN3000000000T"" 	1DN3000000000DN3000000000r   )r   
__module____qualname__r:   weakref	ProxyTyper   classmethodr!   r$   r'   r)   r3   rA   r;   rF   rI   rK   r   r   r   r   r   r      s       K 	D"J"JK	I   [0 4 4 [4
 - - [- - - [- +-    [= = =6+ + +/ / /
/ / /
  
!1 !1 !1 !1 !1r   r   )__doc__rO   rU   objectr   r   r   r   <module>rZ      s[    @ @  W1 W1 W1 W1 W1f W1 W1 W1 W1 W1r   