X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FClass%2FMOP%2FMethod%2FGenerated.pm;h=7442a2f74be049c9d1bdeccdfd94f33388fadb0c;hb=fc76ff60c182b715e632403e0105edbd13566f8c;hp=5702e95eed68e357c2b33c8acbac5d74d987ca6f;hpb=c16a3087fabac823b511ab1fcfa10d0f64f53bf6;p=gitmo%2FClass-MOP.git diff --git a/lib/Class/MOP/Method/Generated.pm b/lib/Class/MOP/Method/Generated.pm index 5702e95..7442a2f 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.74'; +our $VERSION = '0.75'; $VERSION = eval $VERSION; our $AUTHORITY = 'cpan:STEVAN'; @@ -26,6 +26,32 @@ sub new { return $self; } + +sub _prepare_code { + my ( $self, %args ) = @_; + + my ( $line, $file ); + + if ( my $ctx = ( $args{context} || $self->definition_context ) ) { + $line = $ctx->{line}; + if ( my $desc = $ctx->{description} ) { + $file = "$desc defined at $ctx->{file}"; + } else { + $file = $ctx->{file}; + } + } else { + ( $line, $file ) = ( 0, "generated method (unknown origin)" ); + } + + my $code = $args{code}; + + # if it's an array of lines, join it up + # don't use newlines so that the definition context is more meaningful + $code = join(@$code, ' ') if ref $code; + + return qq{#line $line "$file"\n} . $code; +} + sub _new { my $class = shift; my $options = @_ == 1 ? $_[0] : {@_}; @@ -38,13 +64,27 @@ sub _new { ## accessors -sub is_inline { (shift)->{'is_inline'} } +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", + (map { + /^([\@\%\$])/ + or die "capture key should start with \@, \% or \$: $_"; + q!my !.$_.q! = !.$1.q!{$__captures->{'!.$_.q!'}};!; + } keys %$__captures), + $_[2] + ); +} 1;