-
-
Save anonymous/89b9a3651cd277a360c1 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/lib/Mojolicious/Renderer.pm b/lib/Mojolicious/Renderer.pm | |
index 81b856f..3af20fe 100644 | |
--- a/lib/Mojolicious/Renderer.pm | |
+++ b/lib/Mojolicious/Renderer.pm | |
@@ -7,7 +7,7 @@ use Mojo::Cache; | |
use Mojo::JSON 'encode_json'; | |
use Mojo::Home; | |
use Mojo::Loader; | |
-use Mojo::Util qw(decamelize encode slurp); | |
+use Mojo::Util qw(decamelize encode md5_sum monkey_patch slurp); | |
has cache => sub { Mojo::Cache->new }; | |
has classes => sub { ['main'] }; | |
@@ -70,10 +70,18 @@ sub get_data_template { | |
sub get_helper { | |
my ($self, $name) = @_; | |
+ | |
if (my $h = $self->helpers->{$name} || $self->{proxy}{$name}) { return $h } | |
return undef unless grep {/^\Q$name\E\./} keys %{$self->helpers}; | |
- return $self->{proxy}{$name} | |
- = sub { bless [shift, $name], 'Mojolicious::Renderer::_Proxy' }; | |
+ | |
+ my $class = 'Mojolicious::Renderer::Sandbox::' . md5_sum("$name:$self"); | |
+ for my $helper (grep {/^\Q$name\E\.[^.]+(?:\.|$)/} keys %{$self->helpers}) { | |
+ $helper =~ /^(\Q$name\E\.([^.]+))/; | |
+ my $export = $2; | |
+ my $sub = $self->get_helper($1); | |
+ monkey_patch $class, $export => sub { ${shift()}->$sub(@_) }; | |
+ } | |
+ return $self->{proxy}{$name} = sub { bless \(my $dummy = shift), $class }; | |
} | |
sub render { | |
@@ -248,21 +256,6 @@ sub _render_template { | |
return undef; | |
} | |
-package Mojolicious::Renderer::_Proxy; | |
-use Mojo::Base -strict; | |
- | |
-sub AUTOLOAD { | |
- my $self = shift; | |
- | |
- my ($package, $method) = split /::(\w+)$/, our $AUTOLOAD; | |
- my $c = $self->[0]; | |
- Carp::croak qq{Can't locate object method "$method" via package "$package"} | |
- unless my $helper = $c->app->renderer->get_helper("$self->[1].$method"); | |
- return $c->$helper(@_); | |
-} | |
- | |
-sub DESTROY { } | |
- | |
1; | |
=encoding utf8 | |
diff --git a/t/mojolicious/renderer.t b/t/mojolicious/renderer.t | |
index 5f5593a..4a5e812 100644 | |
--- a/t/mojolicious/renderer.t | |
+++ b/t/mojolicious/renderer.t | |
@@ -65,11 +65,11 @@ $c->app->log->unsubscribe(message => $cb); | |
my $first = Mojolicious::Controller->new; | |
$first->app->log->level('fatal'); | |
$first->app->helper('myapp.multi_level.test' => sub {'works!'}); | |
+$first->app->helper('myapp.defaults' => sub { shift->app->defaults(@_) }); | |
ok $first->app->renderer->get_helper('myapp'), 'found helper'; | |
ok $first->app->renderer->get_helper('myapp.multi_level'), 'found helper'; | |
ok $first->app->renderer->get_helper('myapp.multi_level.test'), 'found helper'; | |
is $first->myapp->multi_level->test, 'works!', 'right result'; | |
-$first->app->helper('myapp.defaults' => sub { shift->app->defaults(@_) }); | |
ok $first->app->renderer->get_helper('myapp.defaults'), 'found helper'; | |
is $first->app->renderer->get_helper('myap.'), undef, 'no helper'; | |
is $first->app->renderer->get_helper('yapp'), undef, 'no helper'; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment