Skip to content

Instantly share code, notes, and snippets.

Created August 12, 2014 11:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anonymous/89b9a3651cd277a360c1 to your computer and use it in GitHub Desktop.
Save anonymous/89b9a3651cd277a360c1 to your computer and use it in GitHub Desktop.
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