X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FClass%2FMOP%2FMethod%2FGenerated.pm;h=cb4b1b0385f0d14fd5b2297d7ee32c8b8489aa82;hb=53362bcb1b32d87630190fbf50679dc37bb51adf;hp=f43d33103dde5b703d001594ece68bc205da7376;hpb=af72687d6d45c59be325b4d43c852606c8a2c9c1;p=gitmo%2FClass-MOP.git diff --git a/lib/Class/MOP/Method/Generated.pm b/lib/Class/MOP/Method/Generated.pm index f43d331..cb4b1b0 100644 --- a/lib/Class/MOP/Method/Generated.pm +++ b/lib/Class/MOP/Method/Generated.pm @@ -6,7 +6,7 @@ use warnings; use Carp 'confess'; -our $VERSION = '0.85'; +our $VERSION = '1.11'; $VERSION = eval $VERSION; our $AUTHORITY = 'cpan:STEVAN'; @@ -18,33 +18,68 @@ sub new { confess __PACKAGE__ . " is an abstract base class, you must provide a constructor."; } -sub is_inline { $_[0]{is_inline} } - -sub definition_context { $_[0]{definition_context} } - sub _initialize_body { confess "No body to initialize, " . __PACKAGE__ . " is an abstract base class"; } sub _eval_closure { - # my ($self, $captures, $sub_body) = @_; - my $__captures = $_[1]; - eval join( - "\n", - ( + my ($self, $__captures, $sub_body) = @_; + + my $code; + + my $e = do { + local $@; + local $SIG{__DIE__}; + my $source = join + "\n", ( map { /^([\@\%\$])/ or die "capture key should start with \@, \% or \$: $_"; - q[my ] - . $_ . q[ = ] - . $1 - . q[{$__captures->{'] - . $_ - . q['}};]; - } keys %$__captures - ), - $_[2] - ); + q[my ] + . $_ . q[ = ] + . $1 + . q[{$__captures->{'] + . $_ . q['}};]; + } keys %$__captures + ), + $sub_body; + + $self->_dump_source($source) if $ENV{MOP_PRINT_SOURCE}; + + $code = eval $source; + $@; + }; + + return ( $code, $e ); +} + +sub _dump_source { + my ( $self, $source ) = @_; + + my $output; + if ( eval { require Perl::Tidy } ) { + require File::Spec; + + my $rc_file = File::Spec->catfile( + $INC{'Class/MOP/Method/Generated.pm'}, + ('..') x 5, + 'perltidyrc' + ); + + my %p = ( + source => \$source, + destination => \$output, + ); + $p{perltidyrc} = $rc_file + if -f $rc_file; + + Perl::Tidy::perltidy(%p); + } + else { + $output = $source; + } + + print STDERR "\n", $self->name, ":\n", $output, "\n"; } sub _add_line_directive { @@ -77,7 +112,7 @@ sub _compile_code { my $code = $self->_add_line_directive(%args); - $self->_eval_closure($args{environment}, $code); + return $self->_eval_closure($args{environment}, $code); } 1; @@ -104,7 +139,7 @@ Stevan Little Estevan@iinteractive.comE =head1 COPYRIGHT AND LICENSE -Copyright 2006-2009 by Infinity Interactive, Inc. +Copyright 2006-2010 by Infinity Interactive, Inc. L