# Path: gap/utils/imports.py
# def import_class(class_name):
#     """
#     imports and returns class by its path
# 
#     USAGE:
#         myclass = import_class('StringIO.StringIO')
#         # or
#         from StringIO import StringIO
#         myclass = import_class(StringIO)
#     """
#     if isinstance(class_name, StringTypes):
#         from importlib import import_module
#         module_name, class_name = class_name.rsplit('.', 1)
#         module = import_module(module_name)
#         return getattr(module, class_name)
#     else:
#         return class_name


from types import StringTypes
from webapp2_extras.routes import PathPrefixRoute
from webapp2 import Router
from gap.utils.imports import import_class
import webapp2
        import config
    if isinstance(routes, StringTypes):
        routes = import_class('%s.routes' % routes)
    elif hasattr(routes, 'routes'):
        routes = routes.routes

    routes = [ Router.route_class(*route) if isinstance(route, tuple) else route for route in routes ]

    return PathPrefixRoute(prefix, routes)


class BaseRouter(webapp2.Router):

    def _get_filters(self):
        return [import_class(f) for f in getattr(config, 'REQUEST_FILTERS', [])]  # copy

    def _run_filters(self, direction, method, *args):
        to_return = False
        filters = self._get_filters()[::direction]
        for filter_ in filters:
            if hasattr(filter_, method):
                if not getattr(filter_, method)(*args):
                    to_return = False
                    break
                else:
                    to_return = True
        return to_return

    def _dispatch(self, request, response):
        self._run_filters(1, 'process_request', request, response)
        to_return = super(BaseRouter, self).dispatch(request, response)

# Path: gap/utils/imports.py
# def import_class(class_name):
#     """
#     imports and returns class by its path
# 
#     USAGE:
#         myclass = import_class('StringIO.StringIO')
#         # or
#         from StringIO import StringIO
#         myclass = import_class(StringIO)
#     """
#     if isinstance(class_name, StringTypes):
#         from importlib import import_module
#         module_name, class_name = class_name.rsplit('.', 1)
#         module = import_module(module_name)
#         return getattr(module, class_name)
#     else:
#         return class_name


# Path: gap/utils/routes.py
from types import StringTypes
from webapp2_extras.routes import PathPrefixRoute
from webapp2 import Router
from gap.utils.imports import import_class
import webapp2
        import config

    if isinstance(routes, StringTypes):
        routes = import_class('%s.routes' % routes)
    elif hasattr(routes, 'routes'):
        routes = routes.routes

    routes = [ Router.route_class(*route) if isinstance(route, tuple) else route for route in routes ]

    return PathPrefixRoute(prefix, routes)


class BaseRouter(webapp2.Router):

    def _get_filters(self):
        return [import_class(f) for f in getattr(config, 'REQUEST_FILTERS', [])]  # copy

    def _run_filters(self, direction, method, *args):
        to_return = False
        filters = self._get_filters()[::direction]
        for filter_ in filters:
            if hasattr(filter_, method):
                if not getattr(filter_, method)(*args):
                    to_return = False
                    break
                else:
                    to_return = True
        return to_return

    def _dispatch(self, request, response):
        self._run_filters(1, 'process_request', request, response)
        to_return = super(BaseRouter, self).dispatch(request, response)

        if to_return is not None:  # compatibility with webap2 router