| 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 | ||||||