docs: def addService(self, service, name=None, description=None,
          authenticator=None, expose_request=None, preprocessor=None):
          """
          Adds a service to the gateway.
  
          @param service: The service to add to the gateway.
          @type service: C{callable}, class instance, or a module
          @param name: The name of the service.
          @type name: C{str}
          @raise pyamf.remoting.RemotingError: Service already exists.
          @raise TypeError: C{service} cannot be a scalar value.
          @raise TypeError: C{service} must be C{callable} or a module.
          """
          if isinstance(service, (int, long, float, basestring)):
              raise TypeError("Service cannot be a scalar value")
  
          allowed_types = (types.ModuleType, types.FunctionType, types.DictType,
              types.MethodType, types.InstanceType, types.ObjectType)
  
          if not python.callable(service) and not isinstance(service, allowed_types):
              raise TypeError("Service must be a callable, module, or an object")
  
          if name is None:
              # TODO: include the module in the name
              if isinstance(service, (type, types.ClassType)):
                  name = service.__name__
              elif isinstance(service, types.FunctionType):
                  name = service.func_name
              elif isinstance(service, types.ModuleType):
                  name = service.__name__
              else:
                  name = str(service)
  
          if name in self.services:
              raise remoting.RemotingError("Service %s already exists" % name)
  
          self.services[name] = ServiceWrapper(service, description,
              authenticator, expose_request, preprocessor)