X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FReaction%2FUI%2FRenderingContext%2FTT.pm;h=a29d8d4031f18c37a748326741e70570bf03cdd4;hb=a0ff2c8198d7cfcdefad1cbbaf339bd849a9c2c0;hp=c69fe186b312ede1694992a8a049821f255f8b12;hpb=c97e16f1c7c1883bf433918d34a3d4bb461fc65b;p=catagits%2FReaction.git diff --git a/lib/Reaction/UI/RenderingContext/TT.pm b/lib/Reaction/UI/RenderingContext/TT.pm index c69fe18..a29d8d4 100644 --- a/lib/Reaction/UI/RenderingContext/TT.pm +++ b/lib/Reaction/UI/RenderingContext/TT.pm @@ -4,65 +4,67 @@ use Reaction::Class; use aliased 'Reaction::UI::RenderingContext'; use aliased 'Template::View'; -class TT is RenderingContext, which { +use namespace::clean -except => [ qw(meta) ]; +extends RenderingContext; - our $body; - implements 'dispatch' => as { - my ($self, $render_tree, $args) = @_; + +our $body; +sub dispatch { + my ($self, $render_tree, $args) = @_; #warn "-- dispatch start\n"; - local $body = ''; - my %args_copy = %$args; - foreach my $to_render (@$render_tree) { - my ($type, @to) = @$to_render; - if ($type eq '-layout') { - my ($lset, $fname, $next) = @to; - local $args_copy{call_next} = - (@$next - ? sub { $self->dispatch($next, $args); } - : '' # no point running internal dispatch if nothing -to- dispatch - ); - $self->render($lset, $fname, \%args_copy); - } elsif ($type eq '-render') { - my ($widget, $fname, $over) = @to; - #warn "@to"; - if (defined $over) { - my $count = 0; - $over->each(sub { - local $args_copy{_} = $_[0]; - local $args_copy{count} = ++$count; - $body .= $widget->render($fname, $self, \%args_copy); - }); - } else { + local $body = ''; + my %args_copy = %$args; + foreach my $to_render (@$render_tree) { + my ($type, @to) = @$to_render; + if ($type eq '-layout') { + my ($lset, $fname, $next) = @to; + local $args_copy{call_next} = + (@$next + ? sub { $self->dispatch($next, $args); } + : '' # no point running internal dispatch if nothing -to- dispatch + ); + $self->render($lset, $fname, \%args_copy); + } elsif ($type eq '-render') { + my ($widget, $fname, $over) = @to; + #warn "@to"; + if (defined $over) { + my $count = 0; + $over->each(sub { + local $args_copy{_} = $_[0]; + local $args_copy{count} = ++$count; $body .= $widget->render($fname, $self, \%args_copy); - } + }); + } else { + $body .= $widget->render($fname, $self, \%args_copy); } } + } #warn "-- dispatch end, body: ${body}\n-- end body\nbacktrace: ".Carp::longmess()."\n-- end trace\n"; - return $body; - }; - - implements 'render' => as { - my ($self, $lset, $fname, $args) = @_; + return $body; +}; +sub render { + my ($self, $lset, $fname, $args) = @_; - confess "\$body not in scope" unless defined($body); - - # foreach non-_ prefixed key in the args - # build a subref for this key that passes self so the generator has a - # rendering context when [% key %] is evaluated by TT as $val->() - # (assuming it's a subref - if not just pass through) - - my $tt_args = { - map { - my $arg = $args->{$_}; - ($_ => (ref $arg eq 'CODE' ? sub { $arg->($self, $args) } : $arg)) - } grep { !/^_/ } keys %$args - }; - - $body .= $lset->tt_view->include($fname, $tt_args); -#warn "rendered ${fname}, body length now ".length($body)."\n"; + confess "\$body not in scope" unless defined($body); + + # foreach non-_ prefixed key in the args + # build a subref for this key that passes self so the generator has a + # rendering context when [% key %] is evaluated by TT as $val->() + # (assuming it's a subref - if not just pass through) + + my $tt_args = { + map { + my $arg = $args->{$_}; + ($_ => (ref $arg eq 'CODE' ? sub { $arg->($self, $args) } : $arg)) + } grep { !/^_/ } keys %$args }; + $body .= $lset->tt_view->include($fname, $tt_args); +#warn "rendered ${fname}, body length now ".length($body)."\n"; }; +__PACKAGE__->meta->make_immutable; + + 1;