NAME
Squatting::View - default view class for Squatting
SYNOPSIS
package App::Views;
use Squatting ':views';
our @V = (
V(
'example',
layout => sub {
my ($self, $v, $content) = @_;
"(header $content footer)";
},
home => sub {
my ($self, $v) = @_;
"Hello, $v->{name}";
},
_ => sub {
my ($self, $v) = @_;
"You tried to render $self->{template} which was not defined.";
},
arbitrary_data => [ { is => 'ok' }, 2 ],
)
);
DESCRIPTION
In Squatting, views are objects that contain many templates. Templates are represented by coderefs that will be treated as methods of a view object. The job of a template is to take a hashref of variables and return a string.
Typically, the hashref of variables will be the same as what's in $controller->v
. This is important to note, because if you want a session variable in $controller->state
to affect the template, you have to put it in $controller->v
.
API
General Methods
$view = Squatting::View->new($name, %methods)
The constructor takes a name and a hash of attributes and coderefs. Note that the name must be unique within the package the view is defined.
$view->name
This returns the name of the view.
$view->headers
This returns a hashref of the outgoing HTTP headers.
Template Methods
$content = $view->$template($v)
Any coderef that was given to the constructor may be called by name. Templates should be passed in a hashref ($v
) with variables for it to use to generate the final output.
$content = $view->layout($v, $content)
If you define a template named "layout", it'll be used to wrap the content of all templates whose name do not begin with "_". You can use this feature to provide standard headers and footers for your pages.
$content = $view->_($v)
If you define a template named "_", this will act as a catch-all that can be asked to render anything that wasn't explicitly defined. It's like our version of AUTOLOAD
.
NOTE: You can find out what they tried to render by inspecting $self->{template}
.
This feature is useful when you're using a file-based templating system like Tenjin or Template Toolkit, and you don't want to write a template sub for every single template. Instead, you can make $self->{template}
correspond to a file on disk.
$view->{$template} = \&coderef
You are allowed to directly replace the template coderefs with your own. The most common reason you'd do this would be to replace an app's default layout with your own.
$view->{layout} = sub {
my ($self, $v, $content) = @_;
# ...
};