
    2`                     ,    d Z ddlmZ d Zd Zd Zd Zy)zM
Routines for obtaining the class names
of an object and its parent classes.
    )unique_everseenc                 (    | j                         dd S )zt
    return a tuple of all base classes the class c has as a parent.
    >>> object in all_bases(list)
    True
       Nmrocs    9/usr/lib/python3/dist-packages/jaraco/classes/ancestry.py	all_basesr   	   s     55712;    c                 "    | j                         S )ze
    return a tuple of all classes to which c belongs
    >>> list in all_classes(list)
    True
    r   r   s    r
   all_classesr      s     557Nr   c                 *    t        t        |             S )a:  
    Generator over all subclasses of a given class, in depth-first order.

    >>> bool in list(iter_subclasses(int))
    True
    >>> class A(object): pass
    >>> class B(A): pass
    >>> class C(A): pass
    >>> class D(B,C): pass
    >>> class E(D): pass
    >>>
    >>> for cls in iter_subclasses(A):
    ...     print(cls.__name__)
    B
    D
    E
    C
    >>> # get ALL classes currently defined
    >>> res = [cls.__name__ for cls in iter_subclasses(object)]
    >>> 'type' in res
    True
    >>> 'tuple' in res
    True
    >>> len(res) > 100
    True
    )r   _iter_all_subclasses)clss    r
   iter_subclassesr      s    6 /455r   c              #      K   	 | j                         }|D ]  }| t        |      E d {     y # t        $ r | j                  |       }Y ;w xY w7 'w)N)__subclasses__	TypeErrorr   )r   subssubs      r
   r   r   =   sc     '!!#  (	"3'''(  '!!#&' 	(s/   A3 AAAAAAAN)__doc__more_itertoolsr   r   r   r   r    r   r
   <module>r      s#   
 +6<(r   