package Ark::View::Xslate;
use strict;
use warnings;
use Ark 'View';
has path => (
is => 'rw',
isa => 'ArrayRef',
lazy => 1,
default => sub {
my $self = shift;
[$self->path_to('root')];
},
);
has options => (
is => 'rw',
isa => 'HashRef',
lazy => 1,
default => sub { {} },
);
has extension => (
is => 'rw',
isa => 'Str',
default => '.tx',
);
has xslate => (
is => 'rw',
isa => 'Text::Xslate',
lazy => 1,
default => sub {
my $self = shift;
my $c = sub { $self->context };
my $stash = sub { $self->context->stash };
$self->ensure_class_loaded('Text::Xslate');
Text::Xslate->new(
path => $self->path,
%{ $self->options }
);
},
);
sub template {
my ($self, $template) = @_;
$self->context->stash->{__view_xslate_template} = $template;
$self;
}
sub render {
my $self = shift;
my $template = shift;
my $context = $self->context;
$template ||= $self->context->stash->{__view_xslate_template}
|| $self->context->request->action->reverse
or return;
$self->xslate->render(
$template . $self->extension,
{
%{ $context->stash },
c => $self->context,
@_,
},
);
}
sub process {
my ($self, $c) = @_;
$c->response->body( $self->render );
}
__PACKAGE__->meta->make_immutable;