U
    Pe-                     @   s   U d Z dZddlZddlZddlmZ ddlmZ G dd deZ	G dd	 d	e
Zed
eZeed
< ddlZedeej  edkrejddd ejddd dS )a  
Factory object
==============

The factory can be used to automatically register any class or module
and instantiate classes from it anywhere in your project. It is an
implementation of the
`Factory Pattern <http://en.wikipedia.org/wiki/Factory_pattern>`_.

The class list and available modules are automatically generated by setup.py.

Example for registering a class/module::

    >>> from kivy.factory import Factory
    >>> Factory.register('Widget', module='kivy.uix.widget')
    >>> Factory.register('Vector', module='kivy.vector')

Example of using the Factory::

    >>> from kivy.factory import Factory
    >>> widget = Factory.Widget(pos=(456,456))
    >>> vector = Factory.Vector(9, 2)

Example using a class name::

    >>> from kivy.factory import Factory
    >>> Factory.register('MyWidget', cls=MyWidget)

By default, the first classname you register via the factory is permanent.
If you wish to change the registered class, you need to unregister the
classname before you re-assign it::

    >>> from kivy.factory import Factory
    >>> Factory.register('MyWidget', cls=MyWidget)
    >>> widget = Factory.MyWidget()
    >>> Factory.unregister('MyWidget')
    >>> Factory.register('MyWidget', cls=CustomWidget)
    >>> customWidget = Factory.MyWidget()
)FactoryFactoryBaseFactoryException    N)Logger)register_contextc                   @   s   e Zd ZdS )r   N)__name__
__module____qualname__ r
   r
   0/tmp/pip-unpacked-wheel-xzebddm3/kivy/factory.pyr   1   s   r   c                       sV   e Zd Z fddZedd Zdd Zdd	d
Zdd Zdd Z	dd Z
e
Z  ZS )r   c                    s   t t|   i | _d S )N)superr   __init__classes)self	__class__r
   r   r   7   s    zFactoryBase.__init__c                 C   s   |  }t  |j|_|S )zCreates a instance of the class, and initializes to the state of
        ``factory``.

        :param factory: The factory to initialize from.
        :return: A new instance of this class.
        )copyr   )clsfactoryobjr
   r
   r   create_from;   s    zFactoryBase.create_fromc                 C   s    || j kr| j | d S dS dS )zReturn True if the classname is a template from the
        :class:`~kivy.lang.Builder`.

        .. versionadded:: 1.0.5
        is_templateFNr   )r   	classnamer
   r
   r   r   G   s    
zFactoryBase.is_templateNFc           	      C   s   |dkr |dkr |dkr t d|| jkrl|rh| j| }td||d |d |d |d ||||	 dS |||||d| j|< dS )	a  Register a new classname referring to a real class or
        class definition in a module. Warn, if True will emit a warning message
        when a class is re-declared.

        .. versionchanged:: 1.9.0
            `warn` was added.

        .. versionchanged:: 1.7.0
            :attr:`baseclasses` and :attr:`filename` added

        .. versionchanged:: 1.0.5
            :attr:`is_template` has been added in 1.0.5.
        Nz8You must specify either cls= or module= or baseclasses =zFactory: Ignored class "{}" re-declaration. Current -  module: {}, cls: {}, baseclass: {}, filename: {}. Ignored -  module: {}, cls: {}, baseclass: {}, filename: {}.moduler   baseclassesfilename)r   r   r   r   r   )
ValueErrorr   r   warningformat)	r   r   r   r   r   r   r   warninfor
   r
   r   registerR   s2    

      zFactoryBase.registerc                 G   s$   |D ]}|| j kr| j | qdS )zUnregisters the classnames previously registered via the
        register method. This allows the same classnames to be re-used in
        different contexts.

        .. versionadded:: 1.7.1
        N)r   pop)r   Z
classnamesr   r
   r
   r   
unregisteru   s    
zFactoryBase.unregisterc                    s,    fddj D }|D ]}j |= qdS )zUnregister all the factory objects related to the filename passed in
        the parameter.

        .. versionadded:: 1.7.0
        c                    s"   g | ]}j | d   kr|qS )r   r   ).0xr   r   r
   r   
<listcomp>   s    z8FactoryBase.unregister_from_filename.<locals>.<listcomp>Nr   )r   r   Z	to_removenamer
   r'   r   unregister_from_filename   s    z$FactoryBase.unregister_from_filenamec                 C   s   | j }||kr:|d |d  kr.td| td| || }|d }|d kr|d rtj|d ddd}t||std||d f t|| }|d< nV|d	 rg }|d	 d
D ]}|	t
| qtt|t|i  }|d< ntd|S )Nr   z/First letter of class name <%s> is in lowercasezUnknown class <%s>r   r   *)r)   fromlistlevelz"No class named <%s> in module <%s>r   +z"No information to create the class)r   lowerAttributeErrorr   	importlib
__import__hasattrgetattrsplitappendr   gettypestrtuple)r   r)   r   itemr   r   ZrootwidgetsZbaseclsr
   r
   r   __getattr__   s>    
 zFactoryBase.__getattr__)NNFNNF)r   r   r	   r   classmethodr   r   r"   r$   r*   r<   r7   __classcell__r
   r
   r   r   r   5   s   
      
#&r   r   zFactory: %d symbols loaded__main__ZVectorzkivy.vector)r   ZWidgetzkivy.uix.widget)__doc____all__r   r1   Zkivy.loggerr   Zkivy.contextr   	Exceptionr   objectr   r   __annotations__Zkivy.factory_registersZkivyr!   lenr   r   r"   r
   r
   r
   r   <module>   s   ( 