
    hz                     .    d Z ddlZddlZ G d de      Zy)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y)VisitorFNc                      y)NF selfobjargskwargss       r/home/developers/rajanand/mypropertyqr-fmb-refixing-v2/venv/lib/python3.12/site-packages/fontTools/misc/visitor.py<lambda>zVisitor.<lambda>   s        c                 `      t         k7  sJ d       d j                  vri  _         fd}|S )NzSubclass Visitor instead.	_visitorsc           	      &   | j                   dk(  sJ D ]z  \  }}t        |      t        k7  r|f}t        |      t        k(  r|f}|D ]F  }j                  j                  |i       }|D ]#  }||vsJ d|j                   d|d       | ||<   % H | y )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=E)&jG;#%"HE$ 1E $ 9 9% DI % 1#94 $~~t54 +1	$111 r   )r   __dict__r   )r   r   r   s   `` r   	_registerzVisitor._register   s4    w; ;;dmm+DN	" r   c                 T    t        |      t        k7  r|f}| j                  |dfg      S )NN)r   r   r!   )r   r   s     r   registerzVisitor.register*   s,    =E!jG~~1233r   c                     g }t        |      t        k7  r|f}t        |      t        k(  r|f}|D ]  }|j                  ||f        | j	                  |      S r#   )r   r   r   appendr!   )r   r   r   r   r   s        r   register_attrzVisitor.register_attr0   s]    =E!jG;#HE 	1E  %0	1~~m,,r   c                 $    | j                  |      S r#   )r!   )r   r   s     r   register_attrszVisitor.register_attrs;   s    ~~m,,r   c                     t        |      }| j                         D ]M  } t        | dd       }| |S |j                         D ]&  }| j                  j	                  |d       }|"|c c S  O |S )Nr   )r   mrogetattrr   get)r   thing_defaulttypr   basems          r   _visitorsForzVisitor._visitorsFor?   s|    5kHHJ 	Dk48I   	 NN&&tT2=H	 r   c                 d   t        t        |      j                               }| j                  |      }|j	                  dd      }|D ]f  }|d   dk(  rt        ||      }|j	                  ||      }	|	# |	| |||g|i |}
|
dk(  s|
| j                  rO | j                  |||g|i | h y)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     d3inn&'%%c*	"sD1 		=C1v}C%E#--^<K&!$S%I$I&I%<CKD4D4DDNN3U<T<V<		=r   c                 0     | j                   |g|i | y)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                 >    |D ]  } | j                   |g|i |  y)z)Called to visit any value that is a list.NrC   r   r	   r
   r   r>   s        r   	visitListzVisitor.visitListn   s)     	/EDJJu.t.v.	/r   c                 Z    |j                         D ]  } | j                  |g|i |  y)z/Called to visit any value that is a dictionary.N)valuesr   rE   s        r   	visitDictzVisitor.visitDicts   s/    ZZ\ 	/EDJJu.t.v.	/r   c                      y)zMCalled to visit any value that is not an object, list,
        or dictionary.Nr   r   s       r   	visitLeafzVisitor.visitLeafx   s     	r   c                    | j                  |      j                  dd      }|! || |g|i |}|dk(  s|| j                  ryt        |d      r1t	        |t
        j                        s | j                  |g|i | yt	        |t              r | j                  |g|i | yt	        |t              r | j                  |g|i | y | j                  |g|i | y)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}   s    * '',00t<"dC9$9&9Ce|0@0@3
#JsDII,FDS24262T"DNN3000T"DNN3000DNN3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K	I  0 4 4
 - - - - +-  =6+/
/

!1r   r   )__doc__rO   rU   objectr   r   r   r   <module>rZ      s    @  W1f W1r   