On Wed, Oct 31, 2001 at 08:03:36AM +0800, Gunther Birznieks wrote:
> Yes, this is another benefit of using a strategy pattern, it goes beyond 
> simple directory traversal. Theoretically a given strategy driver could be 
> written to search for templates inside databases according to a set of 
> configure-time rules.

What, like subclassing Template::Provider to fetch templates from a 
database?   :-)

> Another useful pattern for these strategy drivers is chaining. So basically 
> if it's not found in one strategy driver it might try a second one...eg 
> attempt to find the schema in a DB but if it's not there, downgrade to file 
> system.

What, like being able to define multiple template providers which are 
chained together in precisely that way?  :-)

> Anyway, the idea here in terms of having made the suggestion is that using 
> this pattern would allow pluggable template search and loads which seems to 
> me what people really want.

That's a very good idea!  :-)

> Of course, the majority of people need a "simple" search pattern that 
> exists now -- it's OK that this is the "default strategy" because you do 
> not want to penalize the majority of user's whose needs may be simple. But 
> the goal would be to make power user's capable of doing a lot of different 
> search patterns.

Indeed.  In case you hadn't got the message from the numerous smileys, 
that's exactly how TT currently works.  The Template::Provider module 
implements the strategy fo finding and fetching templates.  Chris Nandor
has indeed subclassed it to serve templates from a database for Slashdot.

So you can write your own Template::Provider module to implement any kind
of search algorithm.  The LOAD_TEMPLATES option allows you to specify one
or more template providers to be search in turn, chain-of-command style.

    my $provider = My::Provider->new(...);
    my $template = Template->new( LOAD_TEMPLATES => $provider );

You can also give names to different providers to map particular template
request onto certain strategies:

    my $template = Template->new(
        LOAD_TEMPLATES => [ $regular, $search, $database, $http ],
        PREFIX_MAP => {
            find   => 1,
            dbase  => 2,
            http   => 4,
        }
    );

Then you can do:

    [% INCLUDE header %]
    [% INCLUDE find:header %]
    [% INCLUDE dbase:header %]
    [% INCLUDE http://andywardley.com/templates/header %]

The PREFIX_MAP currently isn't documented because I'd like to clean up 
some of the configuration details before I encourage too many people to 
use it.  But in principal, the functionality is there.


A



Reply via email to