def rpc(rtype=None):
    """Decorator marks a method for export.

    :param type: Specifies which :py:class:`Type` this method will return.

    The return type (rtype) must be one of:

    - An instance of :py:class:`p4p.Type`
    - None, in which case the method must return a :py:class:`p4p.Value`
    - One of the NT helper classes (eg :py:class:`p4p.nt.NTScalar`).
    - A list or tuple used to construct a :py:class:`p4p.Type`.

    Exported methods raise an :py:class:`Exception` to indicate an error to the remote caller.
    :py:class:`RemoteError` may be raised to send a specific message describing the error condition.

    >>> class Example(object):
        @rpc(NTScalar.buildType('d'))
        def add(self, lhs, rhs):
            return {'value':float(lhs)+flost(rhs)}
    """
    wrap = None
    if rtype is None or isinstance(rtype, Type):
        pass
    elif isinstance(type, (list, tuple)):
        rtype = Type(rtype)
    elif hasattr(rtype, 'type'):  # eg. one of the NT* helper classes
        wrap = rtype.wrap
        rtype = rtype.type
    else:
        raise TypeError("Not supported")

    def wrapper(fn):
        if wrap is not None:
            orig = fn

            @wraps(orig)
            def wrapper2(*args, **kws):
                return wrap(orig(*args, **kws))
            fn = wrapper2

        fn._reply_Type = rtype
        return fn
    return wrapper
Decorator marks a method for export.

    :param type: Specifies which :py:class:`Type` this method will return.

    The return type (rtype) must be one of:

    - An instance of :py:class:`p4p.Type`
    - None, in which case the method must return a :py:class:`p4p.Value`
    - One of the NT helper classes (eg :py:class:`p4p.nt.NTScalar`).
    - A list or tuple used to construct a :py:class:`p4p.Type`.

    Exported methods raise an :py:class:`Exception` to indicate an error to the remote caller.
    :py:class:`RemoteError` may be raised to send a specific message describing the error condition.

    >>> class Example(object):
        @rpc(NTScalar.buildType('d'))
        def add(self, lhs, rhs):
            return {'value':float(lhs)+flost(rhs)}