def __init__(self, name, import_name, parts_templates=('parts.html',)):
        from flask import Blueprint

        url_prefix = '/{0}'.format(name)
        self.parts_templates = list(parts_templates)
        self.blueprint = Blueprint(name, import_name,
                                   static_folder='static',
                                   template_folder='templates',
                                   url_prefix=url_prefix)

        self.route = self.blueprint.route
        self.rendering_adapter = RenderingAdapter()
        self.container = None
        self.name = name
        self.lookup = TemplatePathLookup(dirs=[(self.blueprint.root_path, self.blueprint.template_folder)])
        self.module_location = url_prefix + self.blueprint.static_url_path
        self._module = None
        self._module_time_stamp = None
class Component:
    def __init__(self, name, import_name, parts_templates=('parts.html',)):
        from flask import Blueprint

        url_prefix = '/{0}'.format(name)
        self.parts_templates = list(parts_templates)
        self.blueprint = Blueprint(name, import_name,
                                   static_folder='static',
                                   template_folder='templates',
                                   url_prefix=url_prefix)

        self.route = self.blueprint.route
        self.rendering_adapter = RenderingAdapter()
        self.container = None
        self.name = name
        self.lookup = TemplatePathLookup(dirs=[(self.blueprint.root_path, self.blueprint.template_folder)])
        self.module_location = url_prefix + self.blueprint.static_url_path
        self._module = None
        self._module_time_stamp = None

    @property
    def module(self):
        module_def_path = os.path.join(self.blueprint.static_folder, 'module.json')

        if self._module_time_stamp is not None:
            timestamp = os.path.getmtime(module_def_path)
            if timestamp <= self._module_time_stamp:
                return self._module

        if os.path.isfile(module_def_path):
            self._module_time_stamp = os.path.getmtime(module_def_path)
            with open(module_def_path) as f:
                self._module = json.loads(f.read())

        return self._module

    def render_parts(self, name, **context):
        self._assert_registered()
        return self.rendering_adapter.render_parts(
            lookup=self.lookup,
            template_names=self.parts_templates,
            part_name=name,
            **self.container.get_context(context))

    def render_template(self, template_name, **context):
        self._assert_registered()
        return self.rendering_adapter.render_template(
            lookup=self.lookup,
            template_name=template_name,
            **self.container.get_context(context))

    def register(self, container):
        self._assert_not_registered()
        self.container = container
        self.rendering_adapter = container.rendering_adapter
        self.lookup.parent = container.lookup

    def _assert_not_registered(self):
        assert self.container is None, 'Plugin {0} is already registered into container'.format(self.name)

    def _assert_registered(self):
        assert self.container is not None, 'Plugin {0} is not registered into container'.format(self.name)