o
    $x`Š  ã                   @   sV   d Z G dd„ deƒZG dd„ deƒZedejdd„ ej ¡ D ƒƒZG dd„ deƒZd	S )
ag  Odd meta class that doesn't subclass type.

This is used for testing support for ExtensionClass in new interfaces.

  >>> class A(object):
  ...     __metaclass__ = MetaClass
  ...     a = 1
  ...
  >>> A.__name__
  'A'
  >>> A.__bases__ == (object,)
  True
  >>> class B(object):
  ...     __metaclass__ = MetaClass
  ...     b = 1
  ...
  >>> class C(A, B): pass
  ...
  >>> C.__name__
  'C'
  >>> int(C.__bases__ == (A, B))
  1
  >>> a = A()
  >>> aa = A()
  >>> a.a
  1
  >>> aa.a
  1
  >>> aa.a = 2
  >>> a.a
  1
  >>> aa.a
  2
  >>> c = C()
  >>> c.a
  1
  >>> c.b
  1
  >>> c.b = 2
  >>> c.b
  2
  >>> C.c = 1
  >>> c.c
  1
  >>> import sys
  >>> if sys.version[0] == '2': # This test only makes sense under Python 2.x
  ...     from types import ClassType
  ...     assert not isinstance(C, (type, ClassType))

  >>> int(C.__class__.__class__ is C.__class__)
  1
c                   @   s   e Zd Zdd„ ZdS )ÚMetaMetaClassc                 C   s   |dkr| S t  | |¡S ©NÚ	__class__)ÚtypeÚ__getattribute__)ÚclsÚname© r   ú:/usr/lib/python3/dist-packages/zope/interface/tests/odd.pyr   G   s   zMetaMetaClass.__getattribute__N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r	   r   E   s    r   c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )Ú	MetaClasszOdd classes
    c                 C   s   || _ || _| j |¡ d S ©N)r
   Ú	__bases__Ú__dict__Úupdate)Úselfr   ÚbasesÚdictr   r   r	   Ú__init__R   s   zMetaClass.__init__c                 C   s   t | ƒS r   )ÚOddInstance©r   r   r   r	   Ú__call__W   s   zMetaClass.__call__c                 C   s0   | j D ]}t||| ƒ}|| ur|  S qt|ƒ‚r   )r   ÚgetattrÚAttributeError)r   r   ÚbÚvr   r   r	   Ú__getattr__Z   s   
ÿzMetaClass.__getattr__c                 C   s   d| j tt| ƒƒf S )Nz<odd class %s at %s>)r
   ÚhexÚidr   r   r   r	   Ú__repr__a   s   zMetaClass.__repr__N)r
   r   r   Ú__doc__r   r   r   r    r   r   r   r	   r   N   s    r   c                 C   s   i | ]\}}|d vr||“qS )©r   r   )Ú.0Úkr   r   r   r	   Ú
<dictcomp>g   s    ÿr%   c                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )r   c                 C   s   || j d< d S r   r"   )r   r   r   r   r	   r   l   ó   zOddInstance.__init__c                 C   s>   t  | d¡}|dkr|S | || ¡}|| ur|S t|d |ƒS )Nr   r   )Úobjectr   Úgetr   )r   r   r   r   r   r   r	   r   o   s   zOddInstance.__getattribute__c                 C   s   || j |< d S r   r"   )r   r   r   r   r   r	   Ú__setattr__x   r&   zOddInstance.__setattr__c                 C   s   t ƒ ‚r   )ÚNotImplementedError)r   r   r   r   r	   Ú__delattr__{   s   zOddInstance.__delattr__c                 C   s   d| j jtt| ƒƒf S )Nz<odd %s instance at %s>)r   r
   r   r   r   r   r   r	   r    ~   s   ÿzOddInstance.__repr__N)r
   r   r   r   r   r)   r+   r    r   r   r   r	   r   j   s    	r   N)	r!   r   r   r'   r   r   r   Úitemsr   r   r   r   r	   Ú<module>   s   7	þ