Module
######
For the reference see: :doc:`/reference/module`
A *Module* is the main control unit for several components, which for example
will all access a shared service defined in the module.
A *Module* can host *Submodules* which will be either specified through
``Modules`` or inside the *routes* directive with ``load_children``.
The module is responsible for instantiating the one-and-only ``router``
instance, which controls the navigation between components.
Properties of a *Module*
========================
  - Attributes and other defininitions, like *services* in the *Module* can be
    accessed by:
    - Submodules (and components of it)
    - Components (and subcomponents of it) created by the module or during
      routing
  - It can declare:
    - *bindings*: which auto-generates an attribute bound to an *Observable*
    - *services*: which will be added as attributes and instantiated to provide
      a service to components and submodules
    - *modules*: which will be instantiated as submodules. Submodules don't,
      for example, host a ``router`` instance
    - *components*: which will be bootstrapped during initialization (before
      the routing engine takes over, if routes are defined)
    - *routes*: which define the navigation hierarchy
    - *selector* (default: ``None``)
      The default behavior of a module controlling an application is that
      things are plotted in the body of the html document. Where exactly is
      decided by the rendering engine (i.e.: the browser in most cases).
      If finer control is wished, one can
        - Insert a ```` tag in the html document
          and the module will use the tag as the root node for components to be
          rendered to.
        - Specify a different name in the module definition with for example
          ``selector = 'my-module-tag'`` and later have this as a tag in the
          html document as in: ````. Everything
          will be rendered under this tag.
An Empty Module
===============
With no definitions it would simply look like this after having inherited from
``Module`` and if we looked into the contents of each of the directives.
.. code-block:: python
   from anpylar import Module
   class MyModule(Module):
       bindings = {}
       services = {}
       modules = []
       components = []  # can be a single item or an iterable
       routes = []
A more standard look for a real application could look like this.
.. code-block:: python
   from anpylar import Module
   from .app_component import AppComponet
   from .one_component import OneComponent
   from .two_component import TwoComponent
   from .the_service import TheService
   class MyModule(Module):
       bindings = {}
       services = {'the_service': TheService}
       modules = []
       components = AppComponent  # can be a single item or an iterable
       routes = [
           {'path': 'one', 'component': OneComponent,},
           {'path': 'two', 'component': TwoComponent,},
       ]
This defines a *Module* that:
  - Creates a service from ``TheService`` and makes it reachable as an
    attribute under the name ``the_service``
  - Bootstraps the component ``AppComponent`` before the routing engine takes
    over
  - Instantiates the routing engine with two routes: ``http://baseurl/one`` and
    ``http://baseurl/two`` for which components ``OneComponent`` and
    ``TwoComponent`` will be respectively instantiated