Namespaces
=============

Namespaces are used to organize groups of components into categories, and also to "import" components from other files.

If the file `components.html` defines these two components:

    ## components.html
    <%def name="comp1()">
        this is comp1
    </%def>
    
    <%def name="comp2(x)">
        this is comp2, x is ${x}
    </%def>
    
You can make another file, for example `index.html`, that pulls those two components into a namespace called `comp`:

    ## index.html
    <%namespace name="comp" file="components.html"/>
    
    Heres comp1:  ${comp.comp1()}
    Heres comp2:  ${comp.comp2(x=5)}

The `comp` variable above is an instance of `mako.runtime.Namespace`, a **proxy object** which delivers method calls to the underlying template callable using the current context.

`<%namespace>` also provides an `import` attribute which can be used to pull the names into the local namespace, removing the need to call it via the ".".  When `import` is used, the `name` attribute is optional.

    <%namespace file="components.html" import="comp1, comp2"/>
    
    Heres comp1:  ${comp1()}
    Heres comp2:  ${comp2(x=5)}
    
`import` also supports the "*" operator:

    <%namespace file="components.html" import="*"/>

    Heres comp1:  ${comp1()}
    Heres comp2:  ${comp2(x=5)}

The names imported by the `import` attribute take precedence over any names that exist within the current context.

**Note** - in current versions of Mako, usage of "import='*'" is known to decrease performance of the template.  This will be fixed in a future release.

### Ways to Call Namespaces {@name=howtocall}

There are essentially four ways to call a function from a namespace.

The "expression" format, as described previously.  Namespaces are just Python objects with functions on them, and can
be used in expressions like any other function:

    ${mynamespace.somefunction('some arg1', 'some arg2', arg3='some arg3', arg4='some arg4')}
    
Synonymous with the "expression" format is the "custom tag" format, when a "closed" tag is used.  This format, introduced in Mako 0.2.3, allows the usage of a "custom" Mako tag, with the function arguments passed in using named attributes:

    <%mynamespace:somefunction arg1="some arg1" arg2="some arg2" arg3="some arg3" arg4="some arg4"/>
    
When using tags, the values of the arguments are taken as literal strings by default.  To embed Python expressions as arguments, use the embedded expression format:

    <%mynamespace:somefunction arg1="${someobject.format()}" arg2="${somedef(5, 12)}"/>

The "custom tag" format is intended mainly for namespace functions which recognize body content, which in Mako is known as a "def with embedded content":

    <%mynamespace:somefunction arg1="some argument" args="x, y">
        Some record: ${x}, ${y}
    </%mynamespace:somefunction>

The "classic" way to call defs with embedded content is the `<%call>` tag:

    <%call expr="mynamespace.somefunction(arg1='some argument')" args="x, y">
        Some record: ${x}, ${y}
    </%call>

For information on how to construct defs that embed content from the caller, see [defs_defswithcontent](rel:defs_defswithcontent).

### Namespaces from Regular Python Modules {@name=frommodules}

Namespaces can also import regular Python functions from modules.  These callables need to take at least one argument, `context`:

A module file `some/module.py` might contain the callable:

    def my_tag(context):
        context.write("hello world")

A template can use this module via:
    
    <%namespace name="hw" module="some.module"/>

    ${hw.my_tag()}
    
Note that the `context` argument is not needed in the call; the `namespace` tag creates a locally-scoped callable which takes care of it.

### Declaring defs in namespaces.

The `<%namespace>` tag supports the definition of `<%defs>` directly inside the tag.  These defs become part of the namespace like any other function, and will override the definitions pulled in from a remote template or module:
    
    ## define a namespace
    <%namespace name="stuff">
        <%def name="comp1()">
            comp1
        </%def>
    </%namespace>
    
    ## then call it
    ${stuff.comp1()}

### The "body()" method {@name=body}

Every namespace that is generated from a template contains a method called `body()`.  This method corresponds to the main body of the template, and plays its most important roles when using inheritance relationships as well as def-calls-with-content.

Since the `body()` method is available from a namespace just like all the other defs defined in a template, what happens if you send arguments to it ?  By default, the `body()` method accepts no positional arguments, and for usefulness in inheritance scenarios will by default dump all keyword arguments into a dictionary called `pageargs`.  But if you actually want to get at the keyword arguments, Mako recommends you define your own argument signature explicitly.  You do this via using the `<%page>` tag:

    <%page args="x, y, someval=8, scope='foo', **kwargs"/>
    
A template which defines the above signature requires that the variables `x` and `y` are defined, defines default values for `someval` and `scope`, and sets up `**kwargs` to receive all other keyword arguments.  If `**kwargs` or similar is not present, the argument `**pageargs` gets tacked on by Mako.  When the template is called as a top-level template (i.e. via `template.render()`) or via the `<%include>` tag, the values for these arguments will be pulled from the `Context`.  In all other cases, i.e. via calling the `body()` method, the arguments are taken as ordinary arguments from the method call.  So above, the body might be called as:

    ${self.body(5, y=10, someval=15, delta=7)}
    
The `Context` object also supplies a `kwargs` accessor, for cases when youd like to pass along whatever is in the context to a `body()` callable:

    ${next.body(**context.kwargs)}

The usefulness of calls like the above become more apparent when one works with inheriting templates.  For more information on this, as well as the meanings of the names `self` and `next`, see [inheritance](rel:inheritance).

### Namespace methods and properties {@name=properties}

The `Namespace` class includes helpful accessors and methods:

* `attr` - allows access module level attributes by name.  This accessor allows templates to supply "scalar" attributes which are particularly handy in inheritance relationships.  See the example in [inheritance](rel:inheritance).
* `module` - the Python module referenced by this Namespace.  If the namespace references a `Template`, then this module is the equivalent of `template.module`, i.e. the generated module for the template.
* `filename` - the path of the filesystem file used for this Namespace's module or template.  If this is a pure module-based Namespace, this evaluates to `module.__file__`.  If a template-based namespace, it evaluates to the original template file location.
* `template` - the `Template` object referenced by this Namespace, if any.
* `uri` - the uri for this Namespace's template (i.e. whatever was sent to `lookup.get_template()`).  This is the equivalent of `template.uri`.
* `context` - the `Context` object for this namespace.  Namespaces are often created with copies of contexts that contain slightly different data, particularly in inheritance scenarios.  Using the `Context` off of a `Namespace` one can traverse an entire chain of templates that inherit from one-another.
* `get_namespace(uri)` - this method returns a `Namespace` at the given `uri`.  If the given uri is a relative uri (i.e. it does not contain ia leading slash `/`), the uri is adjusted to be relative to the uri **of the namespace itself**.  This method is therefore mostly useful off of the built-in `local` namespace, described in the next section.  In most cases, a template wouldn't need this function, and should instead use the `<%namespace>` tag to load namespaces.  However, since all `<%namespace>` tags are evaulated before the body of the template ever runs, this method can be used to locate namespaces using expressions that were generated within the body code of the template, or to conditionally use a particular namespace.

### Built-in Namespaces {@name=builtin}

The namespace is so great that Mako gives your template one (or two) for free.  The names of these namespaces are `local` and `self`.  Other built-in namespaces include `parent` and `next`, which are optional and are described in [inheritance](rel:inheritance).

#### local

The `local` namespace is basically the namespace for the currently executing template.  This means that all of the top level defs defined in your template, as well as your template's `body()` function, are also available off of the `local` namespace.

The `local` namespace is also where properties like `uri`, `filename`, and `module` and the `get_namespace` method can be particularly useful.

#### self

The `self` namespace, in the case of a template that does not use inheritance, is synonomous with `local`.  If inheritance is used, then `self` references the topmost template in the inheritance chain, where it is most useful for providing the ultimate form of various "method" calls which may have been overridden at various points in an inheritance chain.  See [inheritance](rel:inheritance).

### Inheritable Namespaces

The `<%namespace>` tag includes an optional attribute `inheritable="True"`, which will cause the namespace to be attached to the `self` namespace.  Since `self` is globally available throughout an inheritance chain (described in the next section), all the templates in an inheritance chain can get at the namespace imported in a super-template via `self`.
    
    ## base.html
    <%namespace name="foo" file="foo.html" inheritable="True"/>
    
    ${next.body()}

    ## somefile.html
    <%inherit file="base.html"/>
    
    ${self.foo.bar()}

This allows a super-template to load a whole bunch of namespaces that its inheriting templates can get to, without them having to explicitly load those namespaces themselves.

The `import="*"` part of the `<%namespace>` tag doesn't yet interact with the `inheritable` flag, so currently you have to use the explicit namespace name off of `self`, followed by the desired function name.  But more on this in a future release.
