The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
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;