o
    VÌh–  ã                   @  sP   d Z ddlmZ ddlmZ erddlmZ G dd„ deƒZG dd„ deƒZd	S )
z#
meta.py

Some useful metaclasses.
é    )Úannotations)ÚTYPE_CHECKING)ÚAnyc                   @  s$   e Zd ZU dZded< ddd„ZdS )ÚLeafClassesMetaa÷  
    A metaclass for classes that keeps track of all of them that
    aren't base classes.

    >>> Parent = LeafClassesMeta('MyParentClass', (), {})
    >>> Parent in Parent._leaf_classes
    True
    >>> Child = LeafClassesMeta('MyChildClass', (Parent,), {})
    >>> Child in Parent._leaf_classes
    True
    >>> Parent in Parent._leaf_classes
    False

    >>> Other = LeafClassesMeta('OtherClass', (), {})
    >>> Parent in Other._leaf_classes
    False
    >>> len(Other._leaf_classes)
    1
    zset[type[Any]]Ú_leaf_classesÚnameÚstrÚbasesútuple[type[object], ...]Úattrsúdict[str, object]ÚreturnÚNonec                 C  s6   t | dƒs	tƒ | _t| dƒ}| | ¡ |t|ƒ8 }d S )Nr   )ÚhasattrÚsetr   ÚgetattrÚadd)Úclsr   r	   r   Úleaf_classes© r   úg/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/jaraco/classes/meta.pyÚ__init__&   s
   


zLeafClassesMeta.__init__N)r   r   r	   r
   r   r   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r   r   r   r   r   r      s   
 r   c                      s&   e Zd ZdZdZd‡ fdd„Z‡  ZS )ÚTagRegisteredaY  
    As classes of this metaclass are created, they keep a registry in the
    base class of all classes by a class attribute, indicated by attr_name.

    >>> FooObject = TagRegistered('FooObject', (), dict(tag='foo'))
    >>> FooObject._registry['foo'] is FooObject
    True
    >>> BarObject = TagRegistered('Barobject', (FooObject,), dict(tag='bar'))
    >>> FooObject._registry is BarObject._registry
    True
    >>> len(FooObject._registry)
    2

    '...' below should be 'jaraco.classes' but for pytest-dev/pytest#3396
    >>> FooObject._registry['bar']
    <class '....meta.Barobject'>
    Útagr   r   r	   r
   Ú	namespacer   r   r   c                   sN   t t| ƒ |||¡ t| dƒsi | _| j}t| |jd ƒ}|r%| | j|< d S d S )NÚ	_registry)Úsuperr   r   r   r    Ú	__class__r   Ú	attr_name)r   r   r	   r   ÚmetaÚattr©r"   r   r   r   I   s   
ÿzTagRegistered.__init__)r   r   r	   r
   r   r   r   r   )r   r   r   r   r#   r   Ú__classcell__r   r   r&   r   r   4   s    r   N)	r   Ú
__future__r   Útypingr   r   Útyper   r   r   r   r   r   Ú<module>   s    %