package Mojolicious::Plugin::DefaultHelpers; use Mojo::Base 'Mojolicious::Plugin'; use Mojo::ByteStream; use Mojo::Util 'dumper'; sub register { my ($self, $app) = @_; # Controller alias helpers for my $name (qw(app flash param stash session url_for validation)) { $app->helper($name => sub { shift->$name(@_) }); } # Stash key shortcuts (should not generate log messages) for my $name (qw(extends layout title)) { $app->helper( $name => sub { my $self = shift; my $stash = $self->stash; $stash->{$name} = shift if @_; $self->stash(@_) if @_; return $stash->{$name}; } ); } $app->helper(config => sub { shift->app->config(@_) }); $app->helper(content => \&_content); $app->helper(content_for => \&_content_for); $app->helper(current_route => \&_current_route); $app->helper(dumper => sub { shift; dumper(@_) }); $app->helper(include => \&_include); $app->helper(ua => sub { shift->app->ua }); $app->helper(url_with => \&_url_with); } sub _content { my ($self, $name, $content) = @_; $name ||= 'content'; # Set (first come) my $c = $self->stash->{'mojo.content'} ||= {}; $c->{$name} = defined $c->{$name} ? $c->{$name} : ref $content eq 'CODE' ? $content->() : $content if defined $content; # Get return Mojo::ByteStream->new(defined $c->{$name} ? $c->{$name} : ''); } sub _content_for { my ($self, $name, $content) = @_; return _content($self, $name) unless defined $content; my $c = $self->stash->{'mojo.content'} ||= {}; return $c->{$name} .= ref $content eq 'CODE' ? $content->() : $content; } sub _current_route { return '' unless my $endpoint = shift->match->endpoint; return $endpoint->name unless @_; return $endpoint->name eq shift; } sub _include { my $self = shift; my $template = @_ % 2 ? shift : undef; my $args = {@_, defined $template ? (template => $template) : ()}; # "layout" and "extends" can't be localized my $layout = delete $args->{layout}; my $extends = delete $args->{extends}; # Localize arguments my @keys = keys %$args; local @{$self->stash}{@keys} = @{$args}{@keys}; return $self->render(partial => 1, layout => $layout, extends => $extends); } sub _url_with { my $self = shift; return $self->url_for(@_)->query($self->req->url->query->clone); } 1; =encoding utf8 =head1 NAME Mojolicious::Plugin::DefaultHelpers - Default helpers plugin =head1 SYNOPSIS # Mojolicious $self->plugin('DefaultHelpers'); # Mojolicious::Lite plugin 'DefaultHelpers'; =head1 DESCRIPTION L is a collection of renderer helpers for L. This is a core plugin, that means it is always enabled and its code a good example for learning to build new plugins, you're welcome to fork it. =head1 HELPERS L implements the following helpers. =head2 app %= app->secret Alias for L. =head2 config %= config 'something' Alias for L. =head2 content %= content foo => begin test % end %= content bar => 'Hello World!' %= content 'foo' %= content 'bar' %= content Store partial rendered content in named buffer and retrieve it, defaults to retrieving the named buffer C, which is commonly used for the renderers C and C features. Note that new content will be ignored if the named buffer is already in use. =head2 content_for % content_for foo => begin test % end %= content_for 'foo' Append partial rendered content to named buffer and retrieve it. Note that named buffers are shared with the L helper. % content_for message => begin Hello % end % content_for message => begin world! % end %= content_for 'message' =head2 current_route % if (current_route 'login') { Welcome to Mojolicious! % } %= current_route Check or get name of current route. =head2 dumper %= dumper {some => 'data'} Dump a Perl data structure with L. =head2 extends % extends 'blue'; % extends 'blue', title => 'Blue!'; Extend a template. All additional values get merged into the L. =head2 flash %= flash 'foo' Alias for L. =head2 include %= include 'menubar' %= include 'menubar', format => 'txt' Include a partial template, all arguments get localized automatically and are only available in the partial template. =head2 layout % layout 'green'; % layout 'green', title => 'Green!'; Render this template with a layout. All additional values get merged into the L. =head2 param %= param 'foo' Alias for L. =head2 session %= session 'foo' Alias for L. =head2 stash %= stash 'foo' % stash foo => 'bar'; Alias for L. %= stash('name') // 'Somebody' =head2 title % title 'Welcome!'; % title 'Welcome!', foo => 'bar'; %= title Page title. All additional values get merged into the L. =head2 ua %= ua->get('mojolicio.us')->res->dom->at('title')->text Alias for L. =head2 url_for %= url_for 'named', controller => 'bar', action => 'baz' Alias for L. =head2 url_with %= url_with 'named', controller => 'bar', action => 'baz' Does the same as L, but inherits query parameters from the current request. %= url_with->query([page => 2]) =head2 validation %= validation->param('foo') Alias for L. =head1 METHODS L inherits all methods from L and implements the following new ones. =head2 register $plugin->register(Mojolicious->new); Register helpers in L application. =head1 SEE ALSO L, L, L. =cut