A tile is a piece of web application, i.e. a form, a navigation, etc.

Splitting your application in such small and logic application parts makes it
easy to re-use this application, simplifies application ajaxification and
the use of same application parts in different manners.

Imports.:

    >>> from bda.bfg.tile import Tile
    >>> from bda.bfg.tile import TileRenderer
    >>> from bda.bfg.tile import registerTile
    >>> from bda.bfg.tile import tile
    
We need some dummies as model and request.:

    >>> class Model(object): pass
    >>> model = Model()
    >>> from repoze.bfg.request import DEFAULT_REQUEST_FACTORIES
    >>> request = DEFAULT_REQUEST_FACTORIES[None]['factory'](environ={})
    
The pure Tile itself. Normally you do not create this directly, this is done
due registration, see below.:

    >>> mytile = Tile('testdata/tile1.pt', None)
    >>> mytile(model,  request)
    u'<span>Tile One</span>'

Register a tile using the prior template testtemplate. When no object is given,
the default tile is instanciated as above.:

    >>> registerTile('tileone', 'testdata/tile1.pt')

Render the already registered tile.:

    >>> TileRenderer(model, request)('tileone')
    u'<span>Tile One</span>'

Now the decorator - level=1 is needed for the doctest only to reduce the module
level.:

    >>> @tile('tiletwo', 'testdata/tile2.pt', level=1)
    ... class Tile2(Tile):
    ...     data = u'custom'
    >>> TileRenderer(model, request)('tiletwo')
    u'<span>Tile Two: <b><span>Tile One</span></b></span>'

You can define an attribute which is responsible to render the tile instead of
defining a template, or omit even attribute kw argument, then the attribute
``render`` is called as default rendering attribute.:

    >>> @tile('attrtile')
    ... class Tile2(Tile):
    ...     def render(self):
    ...         return u'<h1>Rendered via attribute call</h1>'
    >>> TileRenderer(model, request)('attrtile')
    u'<h1>Rendered via attribute call</h1>'