code: def rpc(rtype=None):
      
      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
docs: 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)}