# NAME
Text::Caml - Mustache template engine
# SYNOPSIS
    my $view = Text::Caml->new;
    my $output = $view->render_file('template', {title => 'Hello', body => 'there!'});
    # template
    
        
            {{title}}
        
        
            {{body}}
        
    
    $output = $view->render('{{hello}}', {hello => 'hi'});
# DESCRIPTION
[Text::Caml](https://metacpan.org/pod/Text::Caml) is a Mustache-like ([http://mustache.github.com/](http://mustache.github.com/)) template engine.
That means it tends to have no logic in template files.
## Syntax
### Context
Context is the data passed to the template. Context can change during template
rendering and be specific in various cases.
### Variables
Variables are inserted using `{{foo}}` syntax. If a variable is not defined or
empty it is simply ignored.
    Hello {{user}}!
By default every variable is escaped when parsed. This can be omitted using `&`
flag.
    # user is '1 > 2'
    Hello {{user}}! => Hello 1 > 2!
    Hello {{&user}}! => Hello 1 > 2!
Using a `.` syntax it is possible to access deep hash structures.
    # user => {name => 'Larry'}
    {{user.name}}
    Larry
### Comments
Comments are ignored. They can be multiline too.
    foo{{! Comment}}bar
    foo{{!
    Comment
    }}bar
### Sections
Sections are like iterators that iterate over your data. Depending on a
variable type different iterators are created.
- Boolean, `have_comments` is defined, not zero and not empty.
        # have_comments => 1
        {{#have_comments}}
        We have comments!
        {{/have_comments}}
        We have comments!
- Array, `list` is a non-empty array reference. Special variable `{{.}}` is
created to point to the current element.
        # list => [1, 2, 3]
        {{#list}}{{.}}{{/list}}
        123
- Hash, `hash` is a non-empty hash reference. Context is swithed to the
elements.
        # hash => {one => 1, two => 2, three => 3}
        {{#hash}}
        {{one}}{{two}}{{three}}
        {{/hash}}
        123
- Lambda, `lambda` is an anonymous subroutine, that's called with three
arguments: current object instance, template and the context. This can be used
for subrendering, helpers etc.
        wrapped => sub {
            my $self = shift;
            my $text = shift;
            return '' . $self->render($text, @_) . '';
        };
        {{#wrapped}}
        {{name}} is awesome.
        {{/wrapped}}
        Willy is awesome.
### Inverted sections
Inverted sections are run in those situations when normal sections don't. When
boolean value is false, array is empty etc.
    # repo => []
    {{#repo}}
      {{name}}
    {{/repo}}
    {{^repo}}
      No repos :(
    {{/repo}}
    No repos :(
### Partials
Partials are like `inludes` in other templates engines. They are run with the
current context and can be recursive.
    {{#articles}}
    {{>article_summary}}
    {{/articles}}
### Nested Templates
This gives horgan.js style template inheritance.
    {{! header.mustache }}
    
      {{$title}}Default title{{/title}}
    
    {{! base.mustache }}
     
       {{$header}}{{/header}}
       {{$content}}{{/content}}
     
     {{! mypage.mustache }}
     {{Hello world
       {{/content}}
     {{/base}}
     Rendering mypage.mustache would output:
     My page titleHello world
# ATTRIBUTES
## `templates_path`
    my $path = $engine->templates_path;
Return path where templates are searched.
## `set_templates_path`
    my $path = $engine->set_templates_path('templates');
Set base path under which templates are searched.
## `default_partial_extension`
If this option is set that the extension is automatically added to the partial
filenames.
    my $engine = Text::Caml->new(default_partial_extension => 'caml');
    ---
    {{#articles}}
    {{>article_summary}} # article_summary.caml will be searched
    {{/articles}}
# METHODS
## `new`
    my $engine = Text::Caml->new;
Create a new [Text::Caml](https://metacpan.org/pod/Text::Caml) object.
## `render`
    $engine->render('{{foo}}', {foo => 'bar'});
Render template from string.
## `render_file`
    $engine->render_file('template.mustache', {foo => 'bar'});
Render template from file.
# DEVELOPMENT
## Repository
    http://github.com/vti/text-caml
# AUTHOR
Viacheslav Tykhanovskyi, `vti@cpan.org`
# CREDITS
Sergey Zasenko (und3f)
Andrew Rodland (arodland)
Alex Balhatchet (kaoru)
Yves Chevallier
Ovidiu Stateina
# COPYRIGHT AND LICENSE
Copyright (C) 2011-2015, Viacheslav Tykhanovskyi
This program is free software, you can redistribute it and/or modify it under
the terms of the Artistic License version 2.0.