Venus::Process

Process Class

Process Class for Perl 5

method: async method: await method: chdir method: check method: count method: daemon method: data method: decode method: disengage method: encode method: engage method: exchange method: exit method: followers method: fork method: forks method: future method: is_dyadic method: is_follower method: is_leader method: is_registered method: is_unregistered method: join method: kill method: killall method: leader method: leave method: limit method: new method: others method: others_active method: others_inactive method: poll method: pool method: pid method: pids method: ping method: ppid method: prune method: recall method: recallall method: recv method: recvall method: register method: registrants method: restart method: send method: sendall method: serve method: setsid method: started method: status method: stderr method: stdin method: stdout method: stopped method: sync method: trap method: wait method: waitall method: watch method: watchlist method: work method: works method: unregister method: untrap method: unwatch

package main;

use Venus::Process;

my $parent = Venus::Process->new;

my $process = $parent->fork;

if ($process) {
  # do something in child process ...
  $process->exit;
}
else {
  # do something in parent process ...
  $parent->wait(-1);
}

# $parent->exit;

This package provides methods for handling and forking processes.

Venus::Kind::Utility

Venus::Role::Accessible Venus::Role::Buildable Venus::Role::Explainable Venus::Role::Valuable

The alarm attribute is used in calls to alarm when the process is forked, installing an alarm in the forked process if set.

alarm(number $seconds) (number)

{ since => '2.40', }

=example-1 alarm

# given: synopsis

package main;

my $alarm = $parent->alarm;

# undef

The async method creates a new Venus::Process object and asynchronously runs the callback provided via the "work" method. Both process objects are configured to be are dyadic, i.e. representing an exclusing bi-directoral relationship. Additionally, the callback return value will be automatically made available via the "await" method unless it's undefined. This method returns the newly created "dyadic" process object.

async(coderef $code, any @args) (Venus::Process)

{ since => '3.40', }

The await method expects to operate on a "dyadic" process object and blocks the execution of the current process until a value is received from its couterpart. If a timeout is provided, execution will be blocked until a value is received or the wait time expires. If a timeout of 0 is provided, execution will not be blocked. If no timeout is provided at all, execution will block indefinitely.

await(number $timeout) (arrayref)

{ since => '3.40', }

The chdir method changes the working directory the current process is operating within.

chdir(string $path) (Venus::Process)

{ since => '0.06', }

=example-1 chdir

# given: synopsis;

$parent = $parent->chdir;

# bless({...}, 'Venus::Process')

The check method does a non-blocking "waitpid" in perlfunc operation and returns the wait status. In list context, returns the specified process' exit code (if terminated).

check(number $pid) (number, number)

{ since => '0.06', }

=example-1 check

package main;

use Venus::Process;

my $parent = Venus::Process->new;

my ($process, $pid) = $parent->fork;

if ($process) {
  # in forked process ...
  $process->exit;
}

my $check = $parent->check($pid);

# 0

The count method dispatches to the method specified (or the "watchlist" if not specified) and returns a count of the items returned from the dispatched call.

count(string | coderef $code, any @args) (number)

{ since => '2.40', }

The daemon method detaches the process from controlling terminal and runs it in the background as system daemon. This method internally calls "disengage" and "setsid" and attempts to change the working directory to the root directory.

daemon() (Venus::Process)

{ since => '0.06', }

=example-1 daemon

# given: synopsis;

my $daemon = $parent->daemon; # exits parent immediately

# in forked process ...

# $daemon->exit;

The data method returns the number of messages sent to the current process, from the PID or PIDs provided (if any). If no PID list is provided, the count returned is based on the PIDs returned from "watchlist".

data(number @pids) (number)

{ since => '2.91', }

The decode method accepts a string representation of a Perl value and returns the Perl value.

decode(string $data) (any)

{ since => '2.91', }

The disengage method limits the interactivity of the process by changing the working directory to the root directory and redirecting its standard file descriptors from and to /dev/null, or the OS' equivalent. These state changes can be undone by calling the "engage" method.

disengage() (Venus::Process)

{ since => '0.06', }

=example-1 disengage

# given: synopsis;

$parent = $parent->disengage;

# bless({...}, 'Venus::Process')

The encode method accepts a Perl value and returns a string representation of that Perl value.

encode(any $data) (string)

{ since => '2.91', }

The engage method ensures the interactivity of the process by changing the working directory to the directory used to launch the process, and by redirecting/returning its standard file descriptors from and to their defaults. This method effectively does the opposite of the "disengage" method.

engage() (Venus::Process)

{ since => '0.06', }

=example-1 engage

# given: synopsis;

$parent = $parent->engage;

# bless({...}, 'Venus::Process')

The exchange method gets and/or sets the name of the data exchange. The exchange is the ontext in which processes can register and cooperate. Process can cooperate in different exchanges (or contexts) and messages sent to a process in one context are not available to be retrieved will operating in another exchange (or context).

exchange(string $name) (any)

{ since => '2.91', }

The exit method exits the program immediately.

exit(number $status) (number)

{ since => '0.06', }

=example-1 exit

# given: synopsis;

my $exit = $parent->exit;

# 0

The followers method returns the list of PIDs registered under the current "exchange" who are not the "leader".

followers() (arrayref)

{ since => '2.91', }

The fork method calls the system "fork" in perlfunc function and creates a new process running the same program at the same point (or call site). This method returns a new Venus::Process object representing the child process (from within the execution of the child process (or fork)), and returns undef to the parent (or originating) process. In list context, this method returns both the process and PID (or process ID) of the child process. If a callback or argument is provided it will be executed in the child process.

fork(string | coderef $code, any @args) (Venus::Process, number)

{ since => '0.06', }

=example-1 fork

# given: synopsis;

$process = $parent->fork;

# if ($process) {
#   # in forked process ...
#   $process->exit;
# }
# else {
#   # in parent process ...
#   $parent->wait(-1);
# }

# in child process

# bless({...}, 'Venus::Process')

The forks method creates multiple forks by calling the "fork" method n times, based on the count specified. As with the "fork" method, this method returns a new Venus::Process object representing the child process (from within the execution of the child process (or fork)), and returns undef to the parent (or originating) process. In list context, this method returns both the process and an arrayref of PID values (or process IDs) for each of the child processes created. If a callback or argument is provided it will be executed in each child process.

forks(string | coderef $code, any @args) (Venus::Process, within[arrayref, number])

{ since => '0.06', }

=example-1 forks

# given: synopsis;

$process = $parent->forks(5);

# if ($process) {
#   # do something in (each) forked process ...
#   $process->exit;
# }
# else {
#   # do something in parent process ...
#   $parent->wait(-1);
# }

# bless({...}, 'Venus::Process')

The future method creates a new object via "async" which runs the callback asynchronously and returns a Venus::Future object with a promise which eventually resolves to the value emitted or error raised.

future(coderef $code, any @args) (Venus::Future)

{ since => '3.55', }

The is_dyadic method returns true is the process is configured to exclusively communicate with one other process, otherwise returns false.

is_dyadic() (boolean)

{ since => '3.40', }

The is_follower method returns true if the process is not the "leader", otherwise returns false.

is_follower() (boolean)

{ since => '2.91', }

The is_leader method returns true if the process is the "leader", otherwise returns false.

is_leader() (boolean)

{ since => '2.91', }

The is_registered method returns true if the process has registered using the "register" method, otherwise returns false.

is_registered() (boolean)

{ since => '2.91', }

The is_unregistered method returns true if the process has unregistered using the "unregister" method, or had never registered at all, otherwise returns false.

is_unregistered() (boolean)

{ since => '2.91', }

The join method sets the "exchange", registers the process with the exchange using "register", and clears the "watchlist", then returns the invocant.

join(string $name) (Venus::Process)

{ since => '2.91', }

The kill method calls the system "kill" in perlfunc function which sends a signal to a list of processes and returns truthy or falsy. Note: A truthy result doesn't necessarily mean all processes were successfully signalled.

kill(string $signal, number @pids) (number)

{ since => '0.06', }

=example-1 kill

# given: synopsis;

if ($process = $parent->fork) {
  # in forked process ...
  $process->exit;
}

my $kill = $parent->kill('term', int $process);

# 1

The killall method accepts a list of PIDs (or uses the "watchlist" if not provided) and returns the result of calling the "kill" method for each PID. Returns a list in list context.

killall(string $name, number @pids) (arrayref)

{ since => '2.40', }

The leader method uses a simple leader election algorithm to determine the process leader and returns the PID for that process. The leader is always the lowest value active PID (i.e. that responds to "ping").

leader() (number)

{ since => '2.91', }

The leave method sets the "exchange" to undefined, unregisters the process using "unregister", and clears the "watchlist", then returns the invocant.

leave(string $name) (Venus::Process)

{ since => '2.91', }

The limit method blocks the execution of the current process until the number of processes in the "watchlist" falls bellow the count specified. The method returns true once execution continues if execution was blocked, and false if the limit has yet to be reached.

limit(number $count) (boolean)

{ since => '3.40', }

The new method constructs an instance of the package.

new(any @args) (Venus::Process)

{ since => '4.15', }

The others method returns all "registrants" other than the current process, i.e. all other registered process PIDs whether active or inactive.

others() (arrayref)

{ since => '2.91', }

The others_active method returns all "registrants" other than the current process which are active, i.e. all other registered process PIDs that responds to "ping".

others_active() (arrayref)

{ since => '2.91', }

The others_inactive method returns all "registrants" other than the current process which are inactive, i.e. all other registered process PIDs that do not respond to "ping".

others_inactive() (arrayref)

{ since => '2.91', }

The poll method continuously calls the named method or coderef and returns the result that's not undefined, or throws an exception on timeout. If no method name is provided this method will default to calling "recvall".

poll(number $timeout, string | coderef $code, any @args) (arrayref)

{ since => '2.91', }

The pool method blocks the execution of the current process until the number of "other" processes are registered and pingable. This method returns the invocant when successful, or throws an exception if the operation timed out.

pool(number $count, number $timeout) (Venus::Process)

{ since => '2.91', }

The pid method returns the PID of the current process.

pid() (number)

{ since => '2.40', }

The pids method returns the PID of the current process, and the PIDs of any child processes.

pids() (arrayref)

{ since => '2.40', }

The ping method returns truthy if the process of the PID provided is active. If multiple PIDs are provided, this method will return the count of active PIDs.

ping(number @pids) (number)

{ since => '2.01', }

=example-1 ping

# given: synopsis;

if ($process = $parent->fork) {
  # in forked process ...
  $process->exit;
}

my $ping = $parent->ping(int $process);

# 1

The ppid method returns the PID of the parent process (i.e. the process which forked the current process, if any).

ppid() (number)

{ since => '2.91', }

The prune method removes all stopped processes and returns the invocant.

prune() (Venus::Process)

{ since => '2.40', }

The recall method returns the earliest message, sent by the current process to the process specified by the PID provided, which is no longer active (i.e. responding to "ping").

recall(number $pid) (any)

{ since => '2.91', }

The recallall method performs a "recall" on the parent process (if any) via "ppid" and any process listed in the "watchlist", and returns the results.

recallall() (arrayref)

{ since => '2.91', }

The recv method returns the earliest message found from the process specified by the PID provided.

recv(number $pid) (any)

{ since => '2.91', }

The recvall method performs a "recv" on the parent process (if any) via "ppid" and any process listed in the "watchlist", and returns the results.

recvall() (arrayref)

{ since => '2.91', }

The register method declares that the process is willing to cooperate with others (e.g. "send" nad "recv" messages), in a way that's discoverable by other processes, and returns the invocant.

register() (Venus::Process)

{ since => '2.91', }

The registrants method returns the PIDs for all the processes that registered using the "register" method whether they're currently active or not.

registrants() (arrayref)

{ since => '2.91', }

The restart method executes the callback provided for each PID returned by the "stopped" method, passing the pid and the results of "check" to the callback as arguments, and returns the result of each call as an arrayref. In list context, this method returns a list.

restart(coderef $callback) (arrayref)

{ since => '2.40', }

The send method makes the data provided available to the process specified by the PID provided.

send(number $pid, any $data) (Venus::Process)

{ since => '2.91', }

The sendall method performs a "send" on the parent process (if any) via "ppid" and any process listed in the "watchlist", and returns the invocant.

sendall(any $data) (Venus::Process)

{ since => '2.91', }

The serve method executes the callback using "work" until "limit" blocks the execution of the current process, indefinitely. It has the effect of serving the callback and maintaining the desired number of forks until killed or gracefully shutdown.

serve(number $count, coderef $callback) (Venus::Process)

{ since => '3.40', }

The setsid method calls the "setsid" in POSIX function and sets the process group identifier of the current process.

setsid() (number)

{ since => '0.06', }

=example-1 setsid

# given: synopsis;

my $setsid = $parent->setsid;

# 1

The started method returns a list of PIDs whose processes have been started and which have not terminated. Returns a list in list context.

started() (arrayref)

{ since => '2.40', }

The status method executes the callback provided for each PID in the "watchlist", passing the pid and the results of "check" to the callback as arguments, and returns the result of each call as an arrayref. In list context, this method returns a list.

status(coderef $callback) (arrayref)

{ since => '2.40', }

The stderr method redirects STDERR to the path provided, typically /dev/null or some equivalent. If called with no arguments STDERR will be restored to its default.

stderr(string $path) (Venus::Process)

{ since => '0.06', }

=example-1 stderr

# given: synopsis;

$parent = $parent->stderr;

# bless({...}, 'Venus::Process')

The stdin method redirects STDIN to the path provided, typically /dev/null or some equivalent. If called with no arguments STDIN will be restored to its default.

stdin(string $path) (Venus::Process)

{ since => '0.06', }

=example-1 stdin

# given: synopsis;

$parent = $parent->stdin;

# bless({...}, 'Venus::Process')

The stdout method redirects STDOUT to the path provided, typically /dev/null or some equivalent. If called with no arguments STDOUT will be restored to its default.

stdout(string $path) (Venus::Process)

{ since => '0.06', }

=example-1 stdout

# given: synopsis;

$parent = $parent->stdout;

# bless({...}, 'Venus::Process')

The stopped method returns a list of PIDs whose processes have terminated. Returns a list in list context.

stopped() (arrayref)

{ since => '2.40', }

The sync method blocks the execution of the current process until the number of "other" processes are registered, pingable, and have each sent at-least one message to the current process. This method returns the invocant when successful, or throws an exception if the operation timed out.

sync(number $count, number $timeout) (Venus::Process)

{ since => '2.91', }

The trap method registers a process signal trap (or callback) which will be invoked whenever the current process receives that matching signal. The signal traps are globally installed and will overwrite any preexisting behavior. Signal traps are inherited by child processes (or forks) but can be overwritten using this method, or reverted to the default behavior by using the "untrap" method.

trap(string $name, string | coderef $expr) (Venus::Process)

{ since => '0.06', }

=example-1 trap

# given: synopsis;

$parent = $parent->trap(term => sub{
  die 'Something failed!';
});

# bless({...}, 'Venus::Process')

The wait method does a blocking "waitpid" in perlfunc operation and returns the wait status. In list context, returns the specified process' exit code (if terminated).

wait(number $pid) (number, number)

{ since => '0.06', }

=example-1 wait

package main;

use Venus::Process;

my $parent = Venus::Process->new;

my ($process, $pid) = $parent->fork;

if ($process) {
  # in forked process ...
  $process->exit;
}

my $wait = $parent->wait($pid);

# 0

The waitall method does a blocking "wait" call for all processes based on the PIDs provided (or the PIDs returned by "watchlist" if not provided) and returns an arrayref of results from calling "wait" on each PID. Returns a list in list context.

waitall(number @pids) (arrayref)

{ since => '2.40', }

The watch method records PIDs to be watched, e.g. using the "status" method and returns all PIDs being watched. Returns a list in list context.

watch(number @pids) (arrayref)

{ since => '2.40', }

The watchlist method returns the recorded PIDs. Returns a list in list context.

watchlist() (arrayref)

{ since => '2.40', }

The work method forks the current process, runs the callback provided in the child process, and immediately exits after. This method returns the PID of the child process. It is recommended to install an "alarm" in perlfunc in the child process (i.e. callback) to avoid creating zombie processes in situations where the parent process might exit before the child process is done working.

work(string | coderef $code, any @args) (number)

{ since => '0.06', }

=example-1 work

# given: synopsis;

my $pid = $parent->work(sub{
  my ($process) = @_;
  # in forked process ...
  $process->exit;
});

# $pid

The works method creates multiple forks by calling the "work" method n times, based on the count specified. The works method runs the callback provided in the child process, and immediately exits after with an exit code of 0 by default. This method returns the PIDs of the child processes. It is recommended to install an "alarm" in perlfunc in the child process (i.e. callback) to avoid creating zombie processes in situations where the parent process might exit before the child process is done working.

works(number $count, coderef $callback, any @args) (arrayref)

{ since => '2.40', }

The unregister method declares that the process is no longer willing to cooperate with others (e.g. "send" nad "recv" messages), and will no longer be discoverable by other processes, and returns the invocant.

unregister() (Venus::Process)

{ since => '2.91', }

The untrap method restores the process signal trap specified to its default behavior. If called with no arguments, it restores all signal traps overwriting any user-defined signal traps in the current process.

untrap(string $name) (Venus::Process)

{ since => '0.06', }

=example-1 untrap

# given: synopsis;

$parent->trap(chld => 'ignore')->trap(term => sub{
  die 'Something failed!';
});

$parent = $parent->untrap('term');

# bless({...}, 'Venus::Process')

The unwatch method removes the PIDs provided from the watchlist and returns the list of PIDs remaining to be watched. In list context returns a list.

unwatch(number @pids) (arrayref)

{ since => '2.40', }

# given: synopsis;

$parent->chdir('/path/to/nowhere');

# Error! (on.chdir)
# given: synopsis;

$parent->stderr('/path/to/nowhere');

# Error! (on.stderr)
# given: synopsis;

$parent->stdin('/path/to/nowhere');

# Error! (on.stdin)
# given: synopsis;

$parent->stdout('/path/to/nowhere');

# Error! (on.stdout)

This package overloads the "" operator.

This package overloads the ~~ operator.

t/Venus.t: present: authors t/Venus.t: present: license

349 POD Errors

The following errors were encountered while parsing the POD:

Around line 181:

Unknown directive: =name

Around line 189:

Unknown directive: =tagline

Around line 197:

Unknown directive: =abstract

Around line 205:

Unknown directive: =includes

Around line 279:

Unknown directive: =synopsis

Around line 310:

Unknown directive: =description

Around line 318:

Unknown directive: =inherits

Around line 326:

Unknown directive: =integrates

Around line 337:

Unknown directive: =attribute

Around line 342:

Unknown directive: =signature

Around line 346:

Unknown directive: =metadata

Around line 382:

=cut found outside a pod block. Skipping to next block.

Around line 392:

Unknown directive: =method

Around line 401:

Unknown directive: =signature

Around line 405:

Unknown directive: =metadata

Around line 425:

=cut found outside a pod block. Skipping to next block.

Around line 436:

Unknown directive: =method

Around line 445:

Unknown directive: =signature

Around line 449:

Unknown directive: =metadata

Around line 471:

=cut found outside a pod block. Skipping to next block.

Around line 499:

=cut found outside a pod block. Skipping to next block.

Around line 527:

=cut found outside a pod block. Skipping to next block.

Around line 555:

=cut found outside a pod block. Skipping to next block.

Around line 602:

=cut found outside a pod block. Skipping to next block.

Around line 616:

Unknown directive: =method

Around line 621:

Unknown directive: =signature

Around line 625:

Unknown directive: =metadata

Around line 656:

=cut found outside a pod block. Skipping to next block.

Around line 673:

=cut found outside a pod block. Skipping to next block.

Around line 688:

Unknown directive: =method

Around line 694:

Unknown directive: =signature

Around line 698:

Unknown directive: =metadata

Around line 754:

=cut found outside a pod block. Skipping to next block.

Around line 785:

=cut found outside a pod block. Skipping to next block.

Around line 797:

Unknown directive: =method

Around line 803:

Unknown directive: =signature

Around line 807:

Unknown directive: =metadata

Around line 827:

=cut found outside a pod block. Skipping to next block.

Around line 851:

=cut found outside a pod block. Skipping to next block.

Around line 875:

=cut found outside a pod block. Skipping to next block.

Around line 885:

Unknown directive: =method

Around line 891:

Unknown directive: =signature

Around line 895:

Unknown directive: =metadata

Around line 922:

Unknown directive: =method

Around line 928:

Unknown directive: =signature

Around line 932:

Unknown directive: =metadata

Around line 950:

=cut found outside a pod block. Skipping to next block.

Around line 1011:

=cut found outside a pod block. Skipping to next block.

Around line 1095:

=cut found outside a pod block. Skipping to next block.

Around line 1127:

Unknown directive: =method

Around line 1132:

Unknown directive: =signature

Around line 1136:

Unknown directive: =metadata

Around line 1154:

=cut found outside a pod block. Skipping to next block.

Around line 1164:

Unknown directive: =method

Around line 1171:

Unknown directive: =signature

Around line 1175:

Unknown directive: =metadata

Around line 1198:

Unknown directive: =method

Around line 1203:

Unknown directive: =signature

Around line 1207:

Unknown directive: =metadata

Around line 1225:

=cut found outside a pod block. Skipping to next block.

Around line 1235:

Unknown directive: =method

Around line 1242:

Unknown directive: =signature

Around line 1246:

Unknown directive: =metadata

Around line 1269:

Unknown directive: =method

Around line 1277:

Unknown directive: =signature

Around line 1281:

Unknown directive: =metadata

Around line 1299:

=cut found outside a pod block. Skipping to next block.

Around line 1319:

=cut found outside a pod block. Skipping to next block.

Around line 1343:

=cut found outside a pod block. Skipping to next block.

Around line 1353:

Unknown directive: =method

Around line 1357:

Unknown directive: =signature

Around line 1361:

Unknown directive: =metadata

Around line 1394:

=cut found outside a pod block. Skipping to next block.

Around line 1405:

Unknown directive: =method

Around line 1410:

Unknown directive: =signature

Around line 1414:

Unknown directive: =metadata

Around line 1432:

=cut found outside a pod block. Skipping to next block.

Around line 1466:

=cut found outside a pod block. Skipping to next block.

Around line 1479:

Unknown directive: =method

Around line 1489:

Unknown directive: =signature

Around line 1493:

Unknown directive: =metadata

Around line 1551:

=cut found outside a pod block. Skipping to next block.

Around line 1586:

=cut found outside a pod block. Skipping to next block.

Around line 1611:

=cut found outside a pod block. Skipping to next block.

Around line 1644:

=cut found outside a pod block. Skipping to next block.

Around line 1658:

Unknown directive: =method

Around line 1669:

Unknown directive: =signature

Around line 1673:

Unknown directive: =metadata

Around line 1729:

=cut found outside a pod block. Skipping to next block.

Around line 1768:

=cut found outside a pod block. Skipping to next block.

Around line 1780:

Unknown directive: =method

Around line 1786:

Unknown directive: =signature

Around line 1790:

Unknown directive: =metadata

Around line 1810:

=cut found outside a pod block. Skipping to next block.

Around line 1840:

=cut found outside a pod block. Skipping to next block.

Around line 1875:

=cut found outside a pod block. Skipping to next block.

Around line 1910:

=cut found outside a pod block. Skipping to next block.

Around line 1949:

=cut found outside a pod block. Skipping to next block.

Around line 1966:

Unknown directive: =method

Around line 1971:

Unknown directive: =signature

Around line 1975:

Unknown directive: =metadata

Around line 1995:

=cut found outside a pod block. Skipping to next block.

Around line 2020:

=cut found outside a pod block. Skipping to next block.

Around line 2034:

Unknown directive: =method

Around line 2039:

Unknown directive: =signature

Around line 2043:

Unknown directive: =metadata

Around line 2063:

=cut found outside a pod block. Skipping to next block.

Around line 2096:

=cut found outside a pod block. Skipping to next block.

Around line 2132:

=cut found outside a pod block. Skipping to next block.

Around line 2146:

Unknown directive: =method

Around line 2151:

Unknown directive: =signature

Around line 2155:

Unknown directive: =metadata

Around line 2175:

=cut found outside a pod block. Skipping to next block.

Around line 2208:

=cut found outside a pod block. Skipping to next block.

Around line 2244:

=cut found outside a pod block. Skipping to next block.

Around line 2258:

Unknown directive: =method

Around line 2263:

Unknown directive: =signature

Around line 2267:

Unknown directive: =metadata

Around line 2287:

=cut found outside a pod block. Skipping to next block.

Around line 2310:

=cut found outside a pod block. Skipping to next block.

Around line 2322:

Unknown directive: =method

Around line 2328:

Unknown directive: =signature

Around line 2332:

Unknown directive: =metadata

Around line 2352:

=cut found outside a pod block. Skipping to next block.

Around line 2375:

=cut found outside a pod block. Skipping to next block.

Around line 2399:

=cut found outside a pod block. Skipping to next block.

Around line 2411:

Unknown directive: =method

Around line 2416:

Unknown directive: =signature

Around line 2420:

Unknown directive: =metadata

Around line 2440:

=cut found outside a pod block. Skipping to next block.

Around line 2465:

=cut found outside a pod block. Skipping to next block.

Around line 2478:

Unknown directive: =method

Around line 2484:

Unknown directive: =signature

Around line 2488:

Unknown directive: =metadata

Around line 2520:

Unknown directive: =method

Around line 2526:

Unknown directive: =signature

Around line 2530:

Unknown directive: =metadata

Around line 2553:

=cut found outside a pod block. Skipping to next block.

Around line 2581:

=cut found outside a pod block. Skipping to next block.

Around line 2594:

Unknown directive: =method

Around line 2600:

Unknown directive: =signature

Around line 2604:

Unknown directive: =metadata

Around line 2622:

=cut found outside a pod block. Skipping to next block.

Around line 2656:

=cut found outside a pod block. Skipping to next block.

Around line 2679:

=cut found outside a pod block. Skipping to next block.

Around line 2689:

Unknown directive: =method

Around line 2694:

Unknown directive: =signature

Around line 2698:

Unknown directive: =metadata

Around line 2718:

=cut found outside a pod block. Skipping to next block.

Around line 2743:

=cut found outside a pod block. Skipping to next block.

Around line 2756:

Unknown directive: =method

Around line 2763:

Unknown directive: =signature

Around line 2767:

Unknown directive: =metadata

Around line 2793:

=cut found outside a pod block. Skipping to next block.

Around line 2824:

=cut found outside a pod block. Skipping to next block.

Around line 2838:

Unknown directive: =method

Around line 2842:

Unknown directive: =signature

Around line 2846:

Unknown directive: =metadata

Around line 2864:

=cut found outside a pod block. Skipping to next block.

Around line 2885:

=cut found outside a pod block. Skipping to next block.

Around line 2906:

=cut found outside a pod block. Skipping to next block.

Around line 2917:

Unknown directive: =method

Around line 2922:

Unknown directive: =signature

Around line 2926:

Unknown directive: =metadata

Around line 2944:

=cut found outside a pod block. Skipping to next block.

Around line 2978:

=cut found outside a pod block. Skipping to next block.

Around line 2991:

Unknown directive: =method

Around line 2997:

Unknown directive: =signature

Around line 3001:

Unknown directive: =metadata

Around line 3033:

=cut found outside a pod block. Skipping to next block.

Around line 3047:

Unknown directive: =method

Around line 3053:

Unknown directive: =signature

Around line 3057:

Unknown directive: =metadata

Around line 3089:

=cut found outside a pod block. Skipping to next block.

Around line 3103:

Unknown directive: =method

Around line 3109:

Unknown directive: =signature

Around line 3113:

Unknown directive: =metadata

Around line 3131:

=cut found outside a pod block. Skipping to next block.

Around line 3151:

=cut found outside a pod block. Skipping to next block.

Around line 3171:

=cut found outside a pod block. Skipping to next block.

Around line 3195:

=cut found outside a pod block. Skipping to next block.

Around line 3205:

Unknown directive: =method

Around line 3211:

Unknown directive: =signature

Around line 3215:

Unknown directive: =metadata

Around line 3243:

=cut found outside a pod block. Skipping to next block.

Around line 3281:

=cut found outside a pod block. Skipping to next block.

Around line 3320:

=cut found outside a pod block. Skipping to next block.

Around line 3335:

Unknown directive: =method

Around line 3339:

Unknown directive: =signature

Around line 3343:

Unknown directive: =metadata

Around line 3363:

=cut found outside a pod block. Skipping to next block.

Around line 3373:

Unknown directive: =method

Around line 3378:

Unknown directive: =signature

Around line 3382:

Unknown directive: =metadata

Around line 3402:

=cut found outside a pod block. Skipping to next block.

Around line 3426:

=cut found outside a pod block. Skipping to next block.

Around line 3436:

Unknown directive: =method

Around line 3441:

Unknown directive: =signature

Around line 3445:

Unknown directive: =metadata

Around line 3477:

Unknown directive: =method

Around line 3482:

Unknown directive: =signature

Around line 3486:

Unknown directive: =metadata

Around line 3502:

=cut found outside a pod block. Skipping to next block.

Around line 3524:

=cut found outside a pod block. Skipping to next block.

Around line 3535:

Unknown directive: =method

Around line 3539:

Unknown directive: =signature

Around line 3543:

Unknown directive: =metadata

Around line 3565:

=cut found outside a pod block. Skipping to next block.

Around line 3597:

=cut found outside a pod block. Skipping to next block.

Around line 3629:

=cut found outside a pod block. Skipping to next block.

Around line 3643:

Unknown directive: =method

Around line 3649:

Unknown directive: =signature

Around line 3653:

Unknown directive: =metadata

Around line 3685:

=cut found outside a pod block. Skipping to next block.

Around line 3700:

Unknown directive: =method

Around line 3705:

Unknown directive: =signature

Around line 3709:

Unknown directive: =metadata

Around line 3749:

=cut found outside a pod block. Skipping to next block.

Around line 3765:

Unknown directive: =method

Around line 3770:

Unknown directive: =signature

Around line 3774:

Unknown directive: =metadata

Around line 3792:

=cut found outside a pod block. Skipping to next block.

Around line 3832:

=cut found outside a pod block. Skipping to next block.

Around line 3842:

Unknown directive: =method

Around line 3847:

Unknown directive: =signature

Around line 3851:

Unknown directive: =metadata

Around line 3887:

=cut found outside a pod block. Skipping to next block.

Around line 3939:

=cut found outside a pod block. Skipping to next block.

Around line 3953:

Unknown directive: =method

Around line 3959:

Unknown directive: =signature

Around line 3963:

Unknown directive: =metadata

Around line 3981:

=cut found outside a pod block. Skipping to next block.

Around line 3992:

Unknown directive: =method

Around line 3997:

Unknown directive: =signature

Around line 4001:

Unknown directive: =metadata

Around line 4033:

=cut found outside a pod block. Skipping to next block.

Around line 4043:

Unknown directive: =method

Around line 4050:

Unknown directive: =signature

Around line 4054:

Unknown directive: =metadata

Around line 4080:

=cut found outside a pod block. Skipping to next block.

Around line 4093:

Unknown directive: =method

Around line 4098:

Unknown directive: =signature

Around line 4102:

Unknown directive: =metadata

Around line 4120:

=cut found outside a pod block. Skipping to next block.

Around line 4158:

=cut found outside a pod block. Skipping to next block.

Around line 4170:

Unknown directive: =method

Around line 4175:

Unknown directive: =signature

Around line 4179:

Unknown directive: =metadata

Around line 4213:

=cut found outside a pod block. Skipping to next block.

Around line 4233:

Unknown directive: =method

Around line 4240:

Unknown directive: =signature

Around line 4244:

Unknown directive: =metadata

Around line 4270:

=cut found outside a pod block. Skipping to next block.

Around line 4302:

=cut found outside a pod block. Skipping to next block.

Around line 4316:

Unknown directive: =method

Around line 4321:

Unknown directive: =signature

Around line 4325:

Unknown directive: =metadata

Around line 4356:

=cut found outside a pod block. Skipping to next block.

Around line 4368:

Unknown directive: =method

Around line 4373:

Unknown directive: =signature

Around line 4377:

Unknown directive: =metadata

Around line 4397:

=cut found outside a pod block. Skipping to next block.

Around line 4419:

=cut found outside a pod block. Skipping to next block.

Around line 4430:

Unknown directive: =method

Around line 4437:

Unknown directive: =signature

Around line 4441:

Unknown directive: =metadata

Around line 4468:

=cut found outside a pod block. Skipping to next block.

Around line 4500:

=cut found outside a pod block. Skipping to next block.

Around line 4532:

=cut found outside a pod block. Skipping to next block.

Around line 4545:

Unknown directive: =method

Around line 4551:

Unknown directive: =signature

Around line 4555:

Unknown directive: =metadata

Around line 4587:

=cut found outside a pod block. Skipping to next block.

Around line 4599:

Unknown directive: =method

Around line 4605:

Unknown directive: =signature

Around line 4609:

Unknown directive: =metadata

Around line 4641:

=cut found outside a pod block. Skipping to next block.

Around line 4653:

Unknown directive: =method

Around line 4659:

Unknown directive: =signature

Around line 4663:

Unknown directive: =metadata

Around line 4695:

=cut found outside a pod block. Skipping to next block.

Around line 4707:

Unknown directive: =method

Around line 4712:

Unknown directive: =signature

Around line 4716:

Unknown directive: =metadata

Around line 4736:

=cut found outside a pod block. Skipping to next block.

Around line 4759:

=cut found outside a pod block. Skipping to next block.

Around line 4770:

Unknown directive: =method

Around line 4777:

Unknown directive: =signature

Around line 4781:

Unknown directive: =metadata

Around line 4811:

=cut found outside a pod block. Skipping to next block.

Around line 4853:

=cut found outside a pod block. Skipping to next block.

Around line 4896:

=cut found outside a pod block. Skipping to next block.

Around line 4911:

Unknown directive: =method

Around line 4920:

Unknown directive: =signature

Around line 4924:

Unknown directive: =metadata

Around line 4951:

Unknown directive: =method

Around line 4957:

Unknown directive: =signature

Around line 4961:

Unknown directive: =metadata

Around line 5017:

=cut found outside a pod block. Skipping to next block.

Around line 5048:

=cut found outside a pod block. Skipping to next block.

Around line 5060:

Unknown directive: =method

Around line 5067:

Unknown directive: =signature

Around line 5071:

Unknown directive: =metadata

Around line 5091:

=cut found outside a pod block. Skipping to next block.

Around line 5113:

=cut found outside a pod block. Skipping to next block.

Around line 5144:

=cut found outside a pod block. Skipping to next block.

Around line 5157:

Unknown directive: =method

Around line 5162:

Unknown directive: =signature

Around line 5166:

Unknown directive: =metadata

Around line 5186:

=cut found outside a pod block. Skipping to next block.

Around line 5208:

=cut found outside a pod block. Skipping to next block.

Around line 5230:

=cut found outside a pod block. Skipping to next block.

Around line 5254:

=cut found outside a pod block. Skipping to next block.

Around line 5276:

=cut found outside a pod block. Skipping to next block.

Around line 5286:

Unknown directive: =method

Around line 5290:

Unknown directive: =signature

Around line 5294:

Unknown directive: =metadata

Around line 5314:

=cut found outside a pod block. Skipping to next block.

Around line 5338:

=cut found outside a pod block. Skipping to next block.

Around line 5348:

Unknown directive: =method

Around line 5356:

Unknown directive: =signature

Around line 5360:

Unknown directive: =metadata

Around line 5389:

Unknown directive: =method

Around line 5399:

Unknown directive: =signature

Around line 5403:

Unknown directive: =metadata

Around line 5423:

=cut found outside a pod block. Skipping to next block.

Around line 5440:

Unknown directive: =method

Around line 5446:

Unknown directive: =signature

Around line 5450:

Unknown directive: =metadata

Around line 5468:

=cut found outside a pod block. Skipping to next block.

Around line 5479:

Unknown directive: =method

Around line 5485:

Unknown directive: =signature

Around line 5489:

Unknown directive: =metadata

Around line 5531:

=cut found outside a pod block. Skipping to next block.

Around line 5543:

Unknown directive: =method

Around line 5548:

Unknown directive: =signature

Around line 5552:

Unknown directive: =metadata

Around line 5572:

=cut found outside a pod block. Skipping to next block.

Around line 5596:

=cut found outside a pod block. Skipping to next block.

Around line 5620:

=cut found outside a pod block. Skipping to next block.

Around line 5630:

Unknown directive: =raise

Around line 5648:

Unknown directive: =raise

Around line 5666:

Unknown directive: =raise

Around line 5684:

Unknown directive: =raise

Around line 5702:

Unknown directive: =operator

Around line 5718:

=cut found outside a pod block. Skipping to next block.

Around line 5727:

Unknown directive: =operator

Around line 5743:

=cut found outside a pod block. Skipping to next block.

Around line 5749:

Unknown directive: =partials