File: //proc/thread-self/root/lib/python3/dist-packages/twisted/spread/__pycache__/util.cpython-38.pyc
U
��W[� � @ s� d Z ddlmZ ddlmZ ddlmZ ddlmZ ddlm Z ddl
mZ G dd � d �ZG d
d� d�Z
G dd
� d
�ZG dd� d�ZG dd� de�Zee j�G dd� de��ZG dd� dej�Zdd� ZdS )z
Utility classes for spread.
� )�defer)�Failure)�pb)�basic)�
interfaces)�implementerc @ s e Zd Zdd� Zdd� ZdS )�LocalMethodc C s || _ || _d S �N)�local�name)�selfr
r � r
�5/usr/lib/python3/dist-packages/twisted/spread/util.py�__init__ s zLocalMethod.__init__c O s | j j| jf|�|�S r )r
�
callRemoter )r �args�kwr
r
r �__call__ s zLocalMethod.__call__N)�__name__�
__module__�__qualname__r r r
r
r
r r s r c @ s$ e Zd ZdZdZdd� Zdd� ZdS )�
LocalAsRemotezN
A class useful for emulating the effects of remote behavior locally.
� c O sr t | d| �r"t| d| �||�S z t| d| �}t�|||��W S t� }| jr^|�� t�|� Y S X dS )ax
Call a specially-designated local method.
self.callRemote('x') will first try to invoke a method named
sync_x and return its result (which should probably be a
Deferred). Second, it will look for a method called async_x,
which will be called and then have its result (or Failure)
automatically wrapped in a Deferred.
Zsync_Zasync_N)�hasattr�getattrr �succeedr �reportAllTracebacksZprintTraceback�fail)r r r r �method�fr
r
r r # s
zLocalAsRemote.callRemotec C s
t | |�S r )r )r r r
r
r �remoteMethod8 s zLocalAsRemote.remoteMethodN)r r r �__doc__r r r r
r
r
r r s r c @ s* e Zd ZdZd
dd�Zdd� Zdd� Zd S )�LocalAsyncForwarderzD
A class useful for forwarding a locally-defined interface.
r c C s$ |� |�st�|| _|| _|| _d S r )Z
providedBy�AssertionError� forwarded�interfaceClass�failWhenNotImplemented)r r$ r% r&