
    h                     &    S r SSKr " S S\5      rg)z:Generic visitor pattern implementation for Python objects.    Nc                       \ rS rSrSr\S 5       r\S 5       r\S 5       r\S 5       r	\0 4S j5       r
S rS	 rS
 rS rS rS rSrg)Visitor   Fc                 h   ^ ^ T [         :w  d   S5       eST R                  ;  a  0 T l        U U4S jnU$ )NzSubclass Visitor instead.	_visitorsc           	      :  > U R                   S:X  d   eT H  u  p[        U5      [        :w  a  U4n[        U5      [        :X  a  U4nU HK  nTR                  R                  U0 5      nU H&  nXT;  d   SUR                   < SU< S35       eXU'   M(     MM     M     g )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         H/var/www/html/env/lib/python3.13/site-packages/fontTools/misc/visitor.pywrapper"Visitor._register.<locals>.wrapper   s    ??g---"/=E)&jG;#%"HE$E $ 9 9% DI %#4 $~~t54 +1$ !& % #0     )r   __dict__r   )r   r   r   s   `` r   	_registerVisitor._register	   s4    w; ;;dmm+DN	" r   c                 V    [        U5      [        :w  a  U4nU R                  US4/5      $ )NN)r   r   r   )r   r   s     r   registerVisitor.register"   s,    =E!jG~~1233r   c                     / n[        U5      [        :w  a  U4n[        U5      [        :X  a  U4nU H  nUR                  XB45        M     U R	                  U5      $ r   )r   r   r   appendr   )r   r   r   r   r   s        r   register_attrVisitor.register_attr(   sV    =E!jG;#HEE  %0 ~~m,,r   c                 $    U R                  U5      $ r   )r   )r   r   s     r   register_attrsVisitor.register_attrs3   s    ~~m,,r   c                     [        U5      nU R                  5        HR  n [        U SS 5      nUc    U$ UR                  5        H(  nU R                  R	                  US 5      nUc  M$  Us  s  $    MT     U$ )Nr   )r   mrogetattrr   get)r   thing_defaulttypr   basems          r   _visitorsForVisitor._visitorsFor7   sr    5kHHJDk48I   	NN&&tT2=H "  r   c                 t   [        [        U5      R                  5       5      nU R                  U5      nUR	                  SS5      nU Hm  nUS   S:X  a  M  [        X5      nUR	                  Xv5      n	U	b)  U	" XXx/UQ70 UD6n
U
S:X  d  U
c  U R                  (       a  MV  U R                  " XU/UQ70 UD6  Mo     g)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keysr1   r+   r*   defaultStop	visitAttr)selfobjargskwargsr8   r   defaultVisitorkeyvaluevisitorFuncrets              r   visitObjectVisitor.visitObjectG   s     d3inn&'%%c*	"sD1C1v}C%E#--<K&!$SI$I&I%<CKD4D4DNN3U<T<V< r   c                 0    U R                   " U/UQ70 UD6  g)z*Called to visit an attribute of an object.Nr	   )r;   r<   r   rA   r=   r>   s         r   r:   Visitor.visitAttr_   s    

5*4*6*r   c                 B    U H  nU R                   " U/UQ70 UD6  M     g)z)Called to visit any value that is a list.NrG   r;   r<   r=   r>   rA   s        r   	visitListVisitor.visitListc   s"    EJJu.t.v. r   c                 ^    UR                  5        H  nU R                  " U/UQ70 UD6  M     g)z/Called to visit any value that is a dictionary.N)valuesr	   rJ   s        r   	visitDictVisitor.visitDicth   s(    ZZ\EJJu.t.v. "r   c                     g)zECalled to visit any value that is not an object, list,
or dictionary.N )r;   r<   r=   r>   s       r   	visitLeafVisitor.visitLeafm   s     	r   c                    U R                  U5      R                  SS5      nUb'  U" X/UQ70 UD6nUS:X  d  Uc  U R                  (       a  g[        US5      (       a6  [	        U[
        R                  5      (       d  U R                  " U/UQ70 UD6  g[	        U[        5      (       a  U R                  " U/UQ70 UD6  g[	        U[        5      (       a  U R                  " U/UQ70 UD6  gU R                  " U/UQ70 UD6  g)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   )r1   r+   r9   hasattr
isinstanceenumEnumrD   listrK   dictrO   rS   )r;   r<   r=   r>   rB   rC   s         r   r	   Visitor.visitr   s      '',00t<"d9$9&9Ce|0@0@3
##JsDII,F,FS24262T""NN3000T""NN3000NN3000r   rR   N)r
   
__module____qualname____firstlineno__r9   classmethodr   r   r#   r&   r1   rD   r:   rK   rO   rS   r	   __static_attributes__rR   r   r   r   r      s    K 0 4 4
 - - - - +-  =0+/
/

1r   r   )__doc__rX   objectr   rR   r   r   <module>rd      s    @ H1f H1r   