oracular (3) CPS::Governor.3pm.gz

Provided by: libcps-perl_0.19-2_all bug

NAME

       "CPS::Governor" - control the iteration of the "CPS" functions

DESCRIPTION

       Objects based on this abstract class are used by the "gk*" variants of the CPS functions, to control
       their behavior. These objects are expected to provide a method, "again", which the functions will use to
       re-invoke iterations of loops, and so on. By providing a different implementation of this method,
       governor objects can provide such behaviours as rate-limiting, asynchronisation or parallelism, and
       integration with event-based IO frameworks.

CONSTRUCTOR

   $gov = CPS::Governor->new
       Must be called on a subclass which implements the "again" method. Returns a new instance of a governor
       object in that class.

SUBCLASS METHODS

       Because this is an abstract class, instances of it can only be constructed on a subclass which implements
       the following methods:

   $gov->again( $code, @args )
       Execute the function given in the "CODE" reference $code, passing in the arguments @args. If this is
       going to be executed immediately, it should be invoked using a tail-call directly by the "again" method,
       so that the stack does not grow arbitrarily. This can be achieved by, for example:

        @_ = @args;
        goto &$code;

       Alternatively, the Sub::Call::Tail may be used to apply syntactic sugar, allowing you to write instead:

        use Sub::Call::Tail;
        ...
        tail $code->( @args );

EXAMPLES

   A Governor With A Time Delay
       Consider the following subclass, which implements a "CPS::Governor" subclass that calls "sleep()" between
       every invocation.

        package Governor::Sleep

        use base qw( CPS::Governor );

        sub new
        {
           my $class = shift;
           my ( $delay ) = @_;

           my $self = $class->SUPER::new;
           $self->{delay} = $delay;

           return $self;
        }

        sub again
        {
           my $self = shift;
           my $code = shift;

           sleep $self->{delay};

           # @args are still in @_
           goto &$code;
        }

SEE ALSO

       •   Sub::Call::Tail - Tail calls for subroutines and methods

AUTHOR

       Paul Evans <leonerd@leonerd.org.uk>