File: | lib/Railsish/View.pm |
Coverage: | 84.0% |
line | stmt | bran | cond | sub | pod | time | code |
---|---|---|---|---|---|---|---|
1 | package Railsish::View; | ||||||
2 | 1 1 1 | 74 4 11 | use Any::Moose; | ||||
3 | |||||||
4 | has template_root => ( | ||||||
5 | is => "ro", | ||||||
6 | isa => "Str", | ||||||
7 | required => 1 | ||||||
8 | ); | ||||||
9 | |||||||
10 | 1 1 1 | 79 4 5 | use Railsish::ViewHelpers (); | ||||
11 | require UNIVERSAL::require; | ||||||
12 | 1 1 1 | 10 3 13 | use File::Spec::Functions; | ||||
13 | |||||||
14 | sub 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 | |||||||
48 | sub 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 |