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".