docs: def _create_outbound_stream(self, config=None):
          """
          Creates an outbound stream from its config.
  
          Params:
              config:       stream configuration as read by ait.config
          Returns:
              stream:       a Stream
          Raises:
              ValueError:   if any of the required config values are missing
          """
          if config is None:
              raise ValueError('No stream config to create stream from.')
  
          name = self._get_stream_name(config)
          stream_handlers = self._get_stream_handlers(config, name)
          stream_input = config.get('input', None)
          stream_output = config.get('output', None)
  
          if type(stream_output) is int:
              return PortOutputStream(name,
                                      stream_input,
                                      stream_output,
                                      stream_handlers,
                                      zmq_args={'zmq_context': self.broker.context,
                                                'zmq_proxy_xsub_url': self.broker.XSUB_URL,
                                                'zmq_proxy_xpub_url': self.broker.XPUB_URL})
          else:
              if stream_output is not None:
                  log.warn("Output of stream {} is not an integer port. "
                           "Stream outputs can only be ports.".format(name))
              return ZMQStream(name,
                               stream_input,
                               stream_handlers,
                               zmq_args={'zmq_context': self.broker.context,
                                         'zmq_proxy_xsub_url': self.broker.XSUB_URL,
                                         'zmq_proxy_xpub_url': self.broker.XPUB_URL})