@classmethod
def route(cls, path=None, name=None, app=None, **kwargs):
    """
        Register a route by using class' configuration. This method will take
        an optional path, optional route name, and optional app object, and
        register a route for the specified path using class properties.

        If ``path`` is not specified, a path will be obtained by invoking the
        :py:meth:`~RouteBase.get_path` class method. Similarly, if ``name`` is
        not specified, it will be obtained by invoking the
        :py:meth:`~RouteBase.get_name` class method. The default app that is
        used when ``app`` argument is missing is the Bottle's defalt app.

        The handler is registered for http verbs (e.g., GET, POST) for which a
        lower-case method name exists that matches the verb.

        List of plugins that should be applied or skipped can be specified by
        ``include_plugins`` and ``exclude_plugins`` properties respectively.
        These properties should be iterables containing the plugin names as per
        bottle API.
        """
    if not app:
        app = cls.bottle.default_app()
    path = path or cls.get_path()
    if path is None:
        raise RuntimeError('No path specified for {}'.format(cls))
    kwargs['name'] = name or cls.get_name()
    kwargs['method'] = cls.get_valid_methods()
    kwargs['apply'] = cls.include_plugins
    kwargs['skip'] = cls.exclude_plugins
    kwargs['callback'] = cls
    app.route(path, **kwargs)
