
    \d7                        d dl mZmZmZmZmZmZmZ d dlm	Z	 d dl
mZmZmZ d dlmZmZmZ erd dlmZmZ  ed          Z G d d          Zd	ed
efdZedd            Z e	e           G d d                      ZdS )    )TYPE_CHECKINGCallableListOptionalTypeVarUnionoverload)implementer)MissingRenderMethodMissingTemplateLoaderUnexposedMethodError)IRenderableIRequestITemplateLoader)FlattenableTagTc                       e Zd ZdZdedefdZ e            Zedede	defd            Z
edede	dedeeef         fd	            Z
efdede	dedefd
Z
dS )Exposea/  
    Helper for exposing methods for various uses using a simple decorator-style
    callable.

    Instances of this class can be called with one or more functions as
    positional arguments.  The names of these functions will be added to a list
    on the class object of which they are methods.
    funcObjsreturnc                     |st          d          |D ]9}t          |dg           }|                    |            t          |d|           :|d         S )a;  
        Add one or more functions to the set of exposed functions.

        This is a way to declare something about a class definition, similar to
        L{zope.interface.implementer}.  Use it like this::

            magic = Expose('perform extra magic')
            class Foo(Bar):
                def twiddle(self, x, y):
                    ...
                def frob(self, a, b):
                    ...
                magic(twiddle, frob)

        Later you can query the object::

            aFoo = Foo()
            magic.get(aFoo, 'twiddle')(x=1, y=2)

        The call to C{get} will fail if the name it is given has not been
        exposed using C{magic}.

        @param funcObjs: One or more function objects which will be exposed to
        the client.

        @return: The first of C{funcObjs}.
        z,expose() takes at least 1 argument (0 given)exposedThroughr   )	TypeErrorgetattrappendsetattr)selfr   fObjr   s       4lib/python3.11/site-packages/twisted/web/_element.py__call__zExpose.__call__"   sq    8  	LJKKK 	< 	<D+249I2+N+NN!!$'''D*N;;;;{    instance
methodNamec                     d S N )r   r#   r$   s      r    getz
Expose.getH       r"   defaultc                     d S r&   r'   )r   r#   r$   r*   s       r    r(   z
Expose.getL   r)   r"   c                     t          ||d          }t          |dg           }| |vr|| j        u rt          | |          |S |S )aB  
        Retrieve an exposed method with the given name from the given instance.

        @raise UnexposedMethodError: Raised if C{default} is not specified and
        there is no exposed method with the given name.

        @return: A callable object for the named method assigned to the given
        instance.
        Nr   )r   
_nodefaultr   )r   r#   r$   r*   methodr   s         r    r(   z
Expose.getP   sY     :t44 )92>>~%%$/))*4<<<Nr"   N)__name__
__module____qualname____doc__r   r!   objectr-   r	   strr(   r   r   r'   r"   r    r   r      s        "( "x " " " "H JF      X F  a E(TU+DV    X DN ,/:@	     r"   r   thunkr   c                 :    t                      }| j        |_        |S r&   )r   r2   )r5   exposes     r    exposerr8   e   s    XXF]FNMr"   Nc                      dS )a  
    Decorate with L{renderer} to use methods as template render directives.

    For example::

        class Foo(Element):
            @renderer
            def twiddle(self, request, tag):
                return tag('Hello, world.')

        <div xmlns:t="http://twistedmatrix.com/ns/twisted.web.template/0.1">
            <span t:render="twiddle" />
        </div>

    Will result in this final output::

        <div>
            <span>Hello, world.</span>
        </div>
    Nr'   r'   r"   r    rendererr:   k   s      r"   c                       e Zd ZU dZdZee         ed<   ddee         fdZde	de
ee         dgdf         fd	Zd
ee         ddfdZdS )Elementa  
    Base for classes which can render part of a page.

    An Element is a renderer that can be embedded in a stan document and can
    hook its template (from the loader) up to render methods.

    An Element might be used to encapsulate the rendering of a complex piece of
    data which is to be displayed in multiple different contexts.  The Element
    allows the rendering logic to be easily re-used in different ways.

    Element returns render methods which are registered using
    L{twisted.web._element.renderer}.  For example::

        class Menu(Element):
            @renderer
            def items(self, request, tag):
                ....

    Render methods are invoked with two arguments: first, the
    L{twisted.web.http.Request} being served and second, the tag object which
    "invoked" the render method.

    @ivar loader: The factory which will be used to load documents to
        return from C{render}.
    Nloaderc                     |	|| _         d S d S r&   )r=   )r   r=   s     r    __init__zElement.__init__   s     DKKK r"   namer   r   r   c                 b    t                               | |d          }|t          | |          |S )z=
        Look up and return the named render method.
        N)r:   r(   r   )r   r@   r.   s      r    lookupRenderMethodzElement.lookupRenderMethod   s3     dD$//>%dD111r"   requestc                 Z    | j         }|t          |           |                                S )a  
        Implement L{IRenderable} to allow one L{Element} to be embedded in
        another's template or rendering output.

        (This will simply load the template from the C{loader}; when used in a
        template, the flattening engine will keep track of this object
        separately as the object to lookup renderers on and call
        L{Element.renderer} to look them up.  The resulting object from this
        method is not directly associated with this L{Element}.)
        )r=   r   load)r   rC   r=   s      r    renderzElement.render   s,     >'---{{}}r"   r&   )r/   r0   r1   r2   r=   r   r   __annotations__r?   r4   r   r   rB   rF   r'   r"   r    r<   r<      s          4 )-FH_%,,,! !x8 ! ! ! !			8H%u-}<	=	 	 	 	hx0 ]      r"   r<   )r   N)typingr   r   r   r   r   r   r	   zope.interfacer
   twisted.web.errorr   r   r   twisted.web.iwebr   r   r   twisted.web.templater   r   r   r   r8   r:   r<   r'   r"   r    <module>rM      s   U T T T T T T T T T T T T T T T T T & & & & & &         
 D C C C C C C C C C 655555555 GCLLJ J J J J J J JZ8      	   	. [: : : : : : : : : :r"   