use Carp 'confess';
-our $VERSION = '0.75';
+our $VERSION = '0.78';
$VERSION = eval $VERSION;
our $AUTHORITY = 'cpan:STEVAN';
return $self;
}
+sub _new {
+ my $class = shift;
+ my $options = @_ == 1 ? $_[0] : {@_};
+
+ $options->{is_inline} ||= 0;
+ $options->{body} ||= undef;
+
+ bless $options, $class;
+}
+
+## accessors
+
+sub is_inline { $_[0]{is_inline} }
+
+sub definition_context { $_[0]{definition_context} }
-sub _prepare_code {
+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];
+
+ local $@;
+ my $code = join(
+ "\n",
+ (
+ map {
+ /^([\@\%\$])/
+ or die "capture key should start with \@, \% or \$: $_";
+ q[my ]
+ . $_ . q[ = ]
+ . $1
+ . q[{$__captures->{']
+ . $_
+ . q['}};];
+ } keys %$__captures
+ ),
+ $_[2]
+ );
+ my $sub = eval $code;
+
+ die "$@\n$code" if $@;
+
+ return $sub;
+}
+
+sub _add_line_directive {
my ( $self, %args ) = @_;
my ( $line, $file );
return qq{#line $line "$file"\n} . $code;
}
-sub _new {
- my $class = shift;
- my $options = @_ == 1 ? $_[0] : {@_};
-
- $options->{is_inline} ||= 0;
- $options->{body} ||= undef;
-
- bless $options, $class;
-}
+sub _compile_code {
+ my ( $self, %args ) = @_;
-## accessors
+ my $code = $self->_add_line_directive(%args);
-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";
+ $self->_eval_closure($args{environment}, $code);
}
-
1;
__END__