File Coverage

File:lib/Railsish/View.pm
Coverage:84.0%

linestmtbrancondsubpodtimecode
1package Railsish::View;
2
1
1
1
74
4
11
use Any::Moose;
3
4has template_root => (
5    is => "ro",
6    isa => "Str",
7    required => 1
8);
9
10
1
1
1
79
4
5
use Railsish::ViewHelpers ();
11require UNIVERSAL::require;
12
1
1
1
10
3
13
use File::Spec::Functions;
13
14sub render {
15
3
0
25
    my ($self, @args) = @_;
16
17
3
13
    my %vars;
18
19
3
22
    if (@args % 2 == 1) {
20
2
8
        my $thingy = shift @args;
21
2
10
        %vars = @args;
22
23
2
15
        if ( -f catfile($self->template_root, $thingy) ) {
24
0
0
            $vars{file} = $thingy;
25        }
26        else {
27
2
14
            $vars{file} = $self->resolve_template($thingy);
28        }
29    } else {
30
1
7
        %vars = @args;
31    }
32
33
3
53
    unless ( $vars{file} =~ m/\.(\w+)$/ ) {
34
0
0
        die "Don't know how to render $vars{file}\n";
35    }
36
3
24
    my $view_class = "Railsish::View::$1";
37
3
59
    $view_class->require or die $@;
38
39
3
176
    my $view_obj = $view_class->new(
40        template_root => $self->template_root
41    );
42
43
3
31
    my $output = $view_obj->render(%vars);
44
45
3
11
    return $output;
46}
47
48sub resolve_template {
49
2
0
14
    my ($self, $thingy) = @_;
50
51
2
15
    my $dir = $self->template_root;
52
2
13
    my $p = quotemeta($self->template_root) . "/${thingy}.*.*";
53
54    # XXX: TODO: Decide the precedence of multiple matches.
55
2
18
    my @files = glob($p);
56
57
2
1114
    die "Unknown template: $thingy" unless @files;
58
59
2
8
    my $file = $files[0];
60
2
60
    $file =~ s/^$dir\///;
61
2
17
    return $file;
62}
63
64__PACKAGE__->meta->make_immutable;
65
66
67 - 85
=head1 SYNOPSIS

    # Explicit
    Railsish::View->render(template => "foo/bar.html.tt2", %vars);

    # Smart
    Railsish::View->render("foo/bar", %vars);

=head1 DESCRIPTION

Convention:

    file comes with suffixes, template does not.

    file: "foo/bar.html.tt2"
    template "foo/bar"


=cut