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