use Scalar::Util qw(weaken);
use base qw(Exporter);
-our $VERSION = '1.003000';
+our $VERSION = '1.003001';
$VERSION = eval $VERSION;
our @EXPORT = qw(quote_sub unquote_sub quoted_from_sub);
(ref($_[-1]) eq 'HASH' and ref($_[-2]) eq 'HASH')
? pop
: {};
- my $captures = pop if ref($_[-1]) eq 'HASH';
+ my $captures = ref($_[-1]) eq 'HASH' ? pop : undef;
undef($captures) if $captures && !keys %$captures;
my $code = pop;
my $name = $_[0];
- my $deferred;
- $deferred = defer_sub +($options->{no_install} ? undef : $name) => sub {
- unquote_sub($deferred);
+ my $quoted_info;
+ my $deferred = defer_sub +($options->{no_install} ? undef : $name) => sub {
+ unquote_sub($quoted_info->[4]);
};
- $QUOTED{$deferred} = [ $name, $code, $captures ];
- weaken($WEAK_REFS{$deferred} = $deferred);
+ $quoted_info = [ $name, $code, $captures, undef, $deferred ];
+ weaken($QUOTED{$deferred} = $quoted_info);
return $deferred;
}
sub quoted_from_sub {
my ($sub) = @_;
- $WEAK_REFS{$sub||''} and $QUOTED{$sub||''};
+ $QUOTED{$sub||''};
}
sub unquote_sub {
}
sub CLONE {
- %QUOTED = map { $WEAK_REFS{$_} => $QUOTED{$_} } keys %WEAK_REFS;
- %WEAK_REFS = map { $_ => $_ } values %WEAK_REFS;
+ %QUOTED = map { defined $_ ? ($_->[4] => $_) : () } values %QUOTED;
+ weaken($_) for values %QUOTED;
}
1;
+__END__
=head1 NAME
C<$code> is a string that will be turned into code.
C<\%captures> is a hashref of variables that will be made available to the
-code. See the L</SYNOPSIS>'s C<Silly::dagron> for an example using captures.
+code. The keys should be the full name of the variable to be made available,
+including the sigil. The values should be references to the values. The
+variables will contain copies of the values. See the L</SYNOPSIS>'s
+C<Silly::dagron> for an example using captures.
=head3 options
=head1 COPYRIGHT AND LICENSE
See L<Moo> for the copyright and license.
+
+=cut