
    f4                        d dl Z ddlmZ ddlmZ ddlmZmZmZm	Z	m
Z
mZmZ ddlmZ eef ddlmZ ddlmZ d	 Z G d
 de      Zd Zd Z G d de      Z ej2                  e        G d dee      Zd Zd Z G d dee      Zy)    N   )TYPE_INVALID)generate_doc_string)InterfaceInfo
ObjectInfo
StructInfo	VFuncInforegister_interface_infohook_up_vfunc_implementation
GInterface)_gi)_propertyhelper)_signalhelperc                 z    t        j                  dd|       }t        j                  dd|      j                         S )Nz(.)([A-Z][a-z]+)z\1_\2z([a-z0-9])([A-Z]))resublower)names1s     */usr/lib/python3/dist-packages/gi/types.py
snake_caser   ,   s2    	"Hd	3B66%x4::<<    c                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)MetaClassHelperc                 p    | j                   j                         D ]  }t        | |j                  |        y N)__info__get_methodssetattr__name__)clsmethod_infos     r   _setup_methodszMetaClassHelper._setup_methods2   s0    <<335 	<KC--{;	<r   c                     | j                   }|j                         }|y |j                         D ]1  }|j                  }t	        | |      rt        | |t        |             3 y r   )r   get_class_structr   r    hasattrr   classmethod)r!   infoclass_structr"   r   s        r   _setup_class_methodsz$MetaClassHelper._setup_class_methods6   s`    ||,,.'335 	=K''D3%T;{#;<		=r   c           	          | j                   j                         D ]M  }|j                         j                  dd      }t	        | |t        |j                  |j                               O y )N-_)r   
get_fieldsget_namereplacer   property	get_value	set_value)r!   
field_infor   s      r   _setup_fieldszMetaClassHelper._setup_fieldsA   sZ    ,,113 	UJ&&(00c:DCx
(<(<j>R>RST	Ur   c                     | j                   j                         D ]/  }|j                         }|j                         }t	        | ||       1 y r   )r   get_constantsr/   r2   r   )r!   constant_infor   values       r   _setup_constantsz MetaClassHelper._setup_constantsF   sF     \\779 	&M ))+D!++-ECu%	&r   c                    | j                   j                         D ]  \  }}|j                  d      rt        |      s$d}d }| j                  D ]  }t        ||d       }|t        |t              r|} nt        |d      rt        |j                  d      sIt        |j                  j                               }|j                  j                         D ]!  }|d|d|j                         k(  s|}d} n |s n |"t        | j                  |t!        d      d        }||st#        || j                        }	|	|j%                         }
t'        d|d| j                  j)                         d	| j                  j                         d
|
j)                         d	|
j                         d|	j                  j)                         d	|	j                  j                               t+        || j,                  |        y )Ndo_Fr   
get_vfuncsr-   TzMethod z() on class .z+ is ambiguous with methods in base classes z and )__dict__items
startswithcallable__mro__getattr
isinstancer	   r&   r   r   get_type_namer=   r/   find_vfunc_info_in_interface	__bases__lenfind_vfunc_conflict_in_basesget_container	TypeErrorget_namespacer   	__gtype__)r!   
vfunc_namepy_vfuncskip_ambiguity_check
vfunc_infobasemethod	base_namevambiguous_base	base_infos              r   _setup_vfuncszMetaClassHelper._setup_vfuncsL   s   $'LL$6$6$8 :	7 J((/x7I#(  J  z48%*VY*G!'JtZ0|8\&t}}'B'B'DE	113 A!9ajjl%KK%&
/3,	 %4 !9#--TWX]T^T_I`a
% ,%A*cmm%\N%1$.$<$<$>	')3),)C)C)E),)>)>)@)2)@)@)B)2););)=)7)@)@)N)N)P)7)@)@)I)I)K	)* 	+ 	+ -Z-57s:	7r   c                     | j                   j                  d      }|t        |t              sy | j                  dk(  r| j
                  dk(  ry |j                         D ]  }d|j
                  z  }t        | ||         y )Nr   zgi.repository.GObjectObjectzdo_%s)r?   getrE   r   
__module__r    r=   r   )r!   
class_inforR   r   s       r   _setup_native_vfuncsz$MetaClassHelper._setup_native_vfuncs   s{    
 \\%%j1
Z
J%G >>449Q$//1 	+JZ000DCz*	+r   N)	r    r]   __qualname__r#   r*   r5   r:   rY   r_    r   r   r   r   1   s"    <	=U
&;7z+r   r   c                 8   | D ]  }|t         u st        |t               rt        |d      s(t        |j                  t
              r8|j                  j                         D ]  }|j                         |k(  s|c c S  t        |j                  |      }||c S  y )Nr   )
r   
issubclassr&   rE   r   r   r=   r/   rG   rH   )basesrO   rS   vfuncs       r   rG   rG      s      :tZ0D*- dmm]3113 !>>#z1 L!
 -T^^ZHL), r   c                 0   |D ]  }t        |d      rt        |j                  d      s&|j                  j                         }| j                         }|D ]!  }|j                         |k(  s|| k7  s|c c S  t	        | |j
                        }||c S  y )Nr   r=   )r&   r   r=   r/   rJ   rH   )re   rd   klassvfuncsrO   rV   aklasss          r   rJ   rJ      s     uj)ENNL9**,^^%
 	Azz|z)a5j	 .eU__EM r   c                       e Zd ZdZd Zd Zy)_GObjectMetaBasez8Metaclass for automatically registering GObject classes.c                     t         j                  | |||       t        j                  |        t	        j
                  |        | j                  | j                         y r   )type__init__propertyhelperinstall_propertiessignalhelperinstall_signals_type_registerr?   )r!   r   rd   dict_s       r   rn   z_GObjectMetaBase.__init__   sB    c4.))#.$$S)3<<(r   c                     d|v ry | j                   j                  d      ry t        j                  | |j	                  d             y )NrN   zgi.overrides.__gtype_name__)r]   rA   r   type_registerr\   )r!   	namespaces     r   rs   z_GObjectMetaBase._type_register   s>    )# >>$$_5#y}}-=>?r   N)r    r]   r`   __doc__rn   rs   ra   r   r   rk   rk      s    B)
@r   rk   c                   8     e Zd ZdZ fdZd Zed        Z xZS )GObjectMetaz+Meta class used for GI GObject based types.c                    t         t        |   |||       d}| j                  d| j                  j                         z   k(  rd}d}|s| j                  t        j                  k7  rd}|r| j                          y |rt        | j                  t              r| j                          | j                          | j                          | j                          t        | j                  t              r| j                          y t        | j                  t              r$t        | j                  j!                                y y y )NFgi.repository.T)superr{   rn   r]   r   rM   rY   rE   r   r*   r#   r:   r_   r5   r   r
   
get_g_type)r!   r   rd   rt   is_gi_definedis_python_defined	__class__s         r   rn   zGObjectMeta.__init__   s    k3(ue<>>-0J0J0LLL M!;3I3I!I $#,,
3((*   "$$&#,,
3!!#CLL-8'(?(?(AB 9 r   c                     t        |       S r   )mror!   s    r   r   zGObjectMeta.mro   s    3xr   c                     | t         k(  ry| j                  j                  dd      }||S | j                  j	                  d      rt        | j                        S y)zFMeta class property which shows up on any class using this meta-class. ry   N)r}   zgi.overrides)r{   r?   r\   r]   rA   r   r   )r!   docs     r   ry   zGObjectMeta.__doc__   sV     +lly$/?J >>$$%GH&s||44r   )r    r]   r`   ry   rn   r   r1   __classcell__r   s   @r   r{   r{      s%    5C0  r   r{   c                    g }| gg}| j                   rC| j                   D ]  }|t        |j                        gz  } |t        | j                         gz  }|r|D ]6  }|d   }|D cg c]  }||dd v s| }}|rt        |j                   vrd}6 n t	        d      |j                  |       |dd D ]%  }|s|d   |k(  s|d= |r|j                  |       ' |r|S c c}w )a\  Compute the class precedence list (mro) according to C3, with GObject
    interface considerations.

    We override Python's MRO calculation to account for the fact that
    GObject classes are not affected by the diamond problem:
    http://en.wikipedia.org/wiki/Diamond_problem

    Based on http://www.python.org/download/releases/2.3/mro/
    r   r   Nz8Cannot create a consistent method resolution order (MRO))rH   listrC   r   rL   appendremove)Crd   bases_of_subclassesrS   subclass_bases	candidatesnot_heads           r   r   r     s)    E3%{{KK 	8D  D$6#77	8 	Q[[ 122
1 	N&q)I#6Ma)qu:LMHMJi.A.AA 		  * + + 	Y1!4 	?N."3y"@"1%%'..~>		? * L% Ns   &C#3C#c                       y r   ra   )argskwargss     r   nothingr   =  s    r   c                   2     e Zd ZdZ fdZed        Z xZS )
StructMetaz*Meta class used for GI Struct based types.c                    t         t        |   |||       | j                  j	                         }|t
        k7  r|j                  y | j                          | j                          | j                  j                         D ]m  }|j                         s|j                  dk(  s$|j                         r| j                  j                         dk(  sRt        |      | _        t         | _         y  y )Nnewr   )r~   r   rn   r   r   r   pytyper5   r#   r   is_constructorr    get_argumentsget_sizestaticmethod__new__r   )r!   r   rd   rt   g_typer"   r   s         r   rn   zStructMeta.__init__D  s    j#'eU; ((*\!fmm&?<<335 		K))+((E1$224\\**,1*;7  '		r   c                 @    | t         k(  ryt        | j                        S )Nr   )r   r   r   r   s    r   ry   zStructMeta.__doc__Z  s    *"3<<00r   )r    r]   r`   ry   rn   r1   r   r   s   @r   r   r   A  s    4, 1 1r   r   )r   
_constantsr   	docstringr   r   r   r   r   r	   r
   r   r   r   r   ro   r   rq   r   objectr   rG   rJ   rm   rk   _install_metaclassr{   r   r   r   ra   r   r   <module>r      s   . 
 $ *    
J  / +=
h+f h+V4"@t @*   ' (+"O +\-`	1 1r   