NAME¶
Sub::Defer - defer generation of subroutines until they are first called
SYNOPSIS¶
use Sub::Defer;
my $deferred = defer_sub 'Logger::time_since_first_log' => sub {
my $t = time;
sub { time - $t };
};
Logger->time_since_first_log; # returns 0 and replaces itself
Logger->time_since_first_log; # returns time - $t
DESCRIPTION¶
These subroutines provide the user with a convenient way to defer creation of
subroutines and methods until they are first called.
SUBROUTINES¶
defer_sub¶
my $coderef = defer_sub $name => sub { ... };
This subroutine returns a coderef that encapsulates the provided sub - when it
is first called, the provided sub is called and is -itself- expected to return
a subroutine which will be goto'ed to on subsequent calls.
If a name is provided, this also installs the sub as that name - and when the
subroutine is undeferred will re-install the final version for speed.
undefer_sub¶
my $coderef = undefer_sub \&Foo::name;
If the passed coderef has been deferred 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
"SYNOPSIS".