X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FSub%2FDefer.pm;h=236b4a97c0a2c0ae649d8cc2d0b7fdc5ed64e4af;hb=efdff87e4e45cee9e0b2bc5ac2d7659e8870c249;hp=9eb4873ecf47b399df20d08780b4e0ca001d0c7b;hpb=5cadba52437b1d6f405a0e74931ce51d4a993e65;p=gitmo%2FMoo.git diff --git a/lib/Sub/Defer.pm b/lib/Sub/Defer.pm index 9eb4873..236b4a9 100644 --- a/lib/Sub/Defer.pm +++ b/lib/Sub/Defer.pm @@ -4,6 +4,9 @@ use strictures 1; use base qw(Exporter); use Moo::_Utils; +our $VERSION = '1.003000'; +$VERSION = eval $VERSION; + our @EXPORT = qw(defer_sub undefer_sub); our %DEFERRED; @@ -13,6 +16,8 @@ sub undefer_sub { my ($target, $maker, $undeferred_ref) = @{ $DEFERRED{$deferred}||return $deferred }; + return ${$undeferred_ref} + if ${$undeferred_ref}; ${$undeferred_ref} = my $made = $maker->(); # make sure the method slot has not changed since deferral time @@ -23,7 +28,7 @@ sub undefer_sub { # _install_coderef calls are not necessary --ribasushi *{_getglob($target)} = $made; } - push @{$DEFERRED{$made} = $DEFERRED{$deferred}}, $made; + $DEFERRED{$made} = $DEFERRED{$deferred}; return $made; } @@ -36,16 +41,20 @@ sub defer_info { sub defer_sub { my ($target, $maker) = @_; my $undeferred; - my $deferred_string; - my $deferred = sub { - goto &{$undeferred ||= undefer_sub($deferred_string)}; + my $deferred; + $deferred = sub { + $undeferred ||= undefer_sub($deferred); + goto &$undeferred; }; - $deferred_string = "$deferred"; - $DEFERRED{$deferred} = [ $target, $maker, \$undeferred ]; + $DEFERRED{$deferred} = [ $target, $maker, \$undeferred, $deferred ]; _install_coderef($target => $deferred) if defined $target; return $deferred; } +sub CLONE { + %DEFERRED = map { $_->[3] => $_ } values %DEFERRED; +} + 1; =head1 NAME @@ -90,3 +99,15 @@ If the passed coderef has been L this will "undefer" it. If the passed coderef has not been deferred, this will just return it. If this is confusing, take a look at the example in the L. + +=head1 SUPPORT + +See L for support and contact information. + +=head1 AUTHORS + +See L for authors. + +=head1 COPYRIGHT AND LICENSE + +See L for the copyright and license.