
    ]Mh                     .    d 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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 )VisitorFc                 `      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         V/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/fontTools/misc/visitor.py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 4    )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_attr(   ss    ==E!!jG;;#HE 	1 	1E  %0000~~m,,,r   c                 ,    |                      |          S r   )r   )r   r   s     r   register_attrszVisitor.register_attrs3   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._visitorsFor7   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.

        If there is no user-registered visit function, of if there is and it
        returns True, or it returns None (or doesn't return anything) and
        visitor.defaultStop is False (default), then the visitor will proceed
        to call self.visitAttr()*Nr   _F)sortedvarskeysr+   r%   r$   defaultStop	visitAttr)selfobjargskwargsr1   r   defaultVisitorkeyvaluevisitorFuncrets              r   visitObjectzVisitor.visitObjectG   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   )r4   r5   r   r:   r6   r7   s         r   r3   zVisitor.visitAttr_   s*    
5*4***6*****r   c                 2    |D ]} | j         |g|R i | dS )z)Called to visit any value that is a list.Nr?   r4   r5   r6   r7   r:   s        r   	visitListzVisitor.visitListc   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   rA   s        r   	visitDictzVisitor.visitDicth   sH    ZZ\\ 	/ 	/EDJu.t...v....	/ 	/r   c                     dS )zMCalled to visit any value that is not an object, list,
        or dictionary.N )r4   r5   r6   r7   s       r   	visitLeafzVisitor.visitLeafm   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 )a  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.

        If there is no user-registered visit function, of if there is and it
        returns True, or it returns None (or doesn't return anything) and
        visitor.defaultStop is False (default), then 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%   r2   hasattr
isinstanceenumEnumr=   listrB   dictrE   rH   )r4   r5   r6   r7   r;   r<   s         r   r   zVisitor.visitr   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   N)r	   
__module____qualname__r2   classmethodr   r   r   r!   r+   r=   r3   rB   rE   rH   r   rG   r   r   r   r      s        K  [0 4 4 [4
 - - [- - - [- +-    [= = =0+ + +/ / /
/ / /
  
1 1 1 1 1r   r   )__doc__rL   objectr   rG   r   r   <module>rU      sR    @ @ H1 H1 H1 H1 H1f H1 H1 H1 H1 H1r   