docs: def add_route(self, handler, uri, methods=frozenset({'GET'}), host=None,
                    strict_slashes=False):
          '''A helper method to register class instance or
          functions as a handler to the application url
          routes.
  
          :param handler: function or class instance
          :param uri: path of the URL
          :param methods: list or tuple of methods allowed, these are overridden
                          if using a HTTPMethodView
          :param host:
          :return: function or class instance
          '''
          stream = False
          # Handle HTTPMethodView differently
          if hasattr(handler, 'view_class'):
              http_methods = (
                  'GET', 'POST', 'PUT', 'HEAD', 'OPTIONS', 'PATCH', 'DELETE')
              methods = set()
              for method in http_methods:
                  _handler = getattr(handler.view_class, method.lower(), None)
                  if _handler:
                      methods.add(method)
                      if hasattr(_handler, 'is_stream'):
                          stream = True
  
          # handle composition view differently
          if isinstance(handler, self.composition_view_class):
              methods = handler.handlers.keys()
              for _handler in handler.handlers.values():
                  if hasattr(_handler, 'is_stream'):
                      stream = True
                      break
  
          self.route(uri=uri, methods=methods, host=host,
                     strict_slashes=strict_slashes, stream=stream)(handler)
          return handler