Skip to content

Commit

Permalink
basic support for nested helpers
Browse files Browse the repository at this point in the history
  • Loading branch information
kraih committed Aug 8, 2014
1 parent 01d9592 commit cb7f414
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 2 deletions.
2 changes: 1 addition & 1 deletion lib/Mojolicious.pm
Expand Up @@ -54,7 +54,7 @@ sub AUTOLOAD {

# Call helper with fresh controller
croak qq{Can't locate object method "$method" via package "$package"}
unless my $helper = $self->renderer->helpers->{$method};
unless my $helper = $self->renderer->get_helper($method);
return $self->build_controller->$helper(@_);
}

Expand Down
2 changes: 1 addition & 1 deletion lib/Mojolicious/Controller.pm
Expand Up @@ -33,7 +33,7 @@ sub AUTOLOAD {

# Call helper with current controller
Carp::croak qq{Can't locate object method "$method" via package "$package"}
unless my $helper = $self->app->renderer->helpers->{$method};
unless my $helper = $self->app->renderer->get_helper($method);
return $self->$helper(@_);
}

Expand Down
16 changes: 16 additions & 0 deletions lib/Mojolicious/Renderer.pm
Expand Up @@ -7,6 +7,7 @@ use Mojo::JSON 'encode_json';
use Mojo::Home;
use Mojo::Loader;
use Mojo::Util qw(decamelize encode slurp);
use Mojolicious::Renderer::Helpers;

has cache => sub { Mojo::Cache->new };
has classes => sub { ['main'] };
Expand Down Expand Up @@ -67,6 +68,21 @@ sub get_data_template {
return $loader->data($self->{index}{$template}, $template);
}

sub get_helper {
my ($self, $name) = @_;

my $helpers = $self->helpers;
return $helpers->{$name} if $helpers->{$name};

my $lookup = $self->{lookup} ||= {};
$lookup->{$name} = 1
if $lookup->{$name} || grep { $_ =~ /^\Q$name\E\./ } keys %$helpers;
return undef unless $lookup->{$name};
return sub {
Mojolicious::Renderer::Helpers->new(controller => shift, prefix => $name);
};
}

sub render {
my ($self, $c, $args) = @_;
$args ||= {};
Expand Down
23 changes: 23 additions & 0 deletions lib/Mojolicious/Renderer/Helpers.pm
@@ -0,0 +1,23 @@
package Mojolicious::Renderer::Helpers;
use Mojo::Base -base;

use Carp 'croak';
use Scalar::Util 'blessed';

has [qw(controller prefix)];

sub AUTOLOAD {
my $self = shift;

my ($package, $method) = split /::(\w+)$/, our $AUTOLOAD;
croak "Undefined subroutine &${package}::$method called"
unless blessed $self && $self->isa(__PACKAGE__);

my $c = $self->controller;
my $name = $self->prefix . ".$method";
croak qq{Can't locate object method "$method" via package "$package"}
unless my $helper = $c->app->renderer->get_helper($name);
return $c->$helper(@_);
}

1;

0 comments on commit cb7f414

Please sign in to comment.