package Eval::Closure;
+use strict;
+use warnings;
use Sub::Exporter -setup => {
exports => [qw(eval_closure)],
groups => { default => [qw(eval_closure)] },
$args{source} = _canonicalize_source($args{source});
_validate_env($args{environment} ||= {});
- my ($code, $e) = _clean_eval_closure(@args{qw(source environment name)});
+ $args{source} = _line_directive($args{description}) . $args{source}
+ if defined $args{description};
+
+ my ($code, $e) = _clean_eval_closure(@args{qw(source environment)});
croak("Failed to compile source: $e\n\nsource:\n$args{source}")
unless $code;
unless reftype($env) eq 'HASH';
for my $var (keys %$env) {
- croak("Environment key '$_' should start with \@, \%, or \$")
+ croak("Environment key '$var' should start with \@, \%, or \$")
unless $var =~ /^([\@\%\$])/;
croak("Environment values must be references, not $env->{$var}")
unless ref($env->{$var});
}
}
+sub _line_directive {
+ my ($description) = @_;
+
+ return qq{#line 1 "$description"\n};
+}
+
sub _clean_eval_closure {
- # my ($source, $__captures, $name) = @_
+ # my ($source, $__captures) = @_
my $__captures = $_[1];
local $@;
local $SIG{__DIE__};
if ($ENV{EVAL_CLOSURE_PRINT_SOURCE}) {
- _dump_source(_make_source(@_), $_[2]);
+ _dump_source(_make_source(@_));
}
my $code = eval _make_source(@_);
}
sub _dump_source {
- my ($source, $name) = @_;
+ my ($source) = @_;
my $output;
if (try { require Perl::Tidy }) {
$output = $source;
}
- $name = defined($name) ? $name : "__ANON__";
- warn $name . ":\n" . $output . "\n";
+ warn "$output\n";
}
1;