NAME

Sub::Multi::Tiny::Util - Internal utilities for Sub::Multi::Tiny

SYNOPSIS

Used by Sub::Multi::Tiny.

VARIABLES

$VERBOSE

Set this truthy for extra debug output. "import" in Sub::Multi::Tiny sets this based on environment variable SUB_MULTI_TINY_VERBOSE.

FUNCTIONS

_croak

As "croak" in Carp, but lazily loads Carp.

_carp

As "carp" in Carp, but lazily loads Carp.

_line_mark_string

Add a #line directive to a string. Usage:

my $str = _line_mark_string <<EOT ;
$contents
EOT

or

my $str = _line_mark_string __FILE__, __LINE__, <<EOT ;
$contents
EOT

In the first form, information from caller will be used for the filename and line number.

The #line directive will point to the line after the _line_mark_string invocation, i.e., the first line of $contents. Generally, $contents will be source code, although this is not required.

$contents must be defined, but can be empty.

_hlog

Log information if "$VERBOSE" is set. Usage:

_hlog { <list of things to log> } [optional min verbosity level (default 1)];

The items in the list are joined by ' ' on output, and a '\n' is added. Each line is prefixed with '# ' for the benefit of test runs.

The list is in {} so that it won't be evaluated if logging is turned off. It is a full block, so you can run arbitrary code to decide what to log. If the block returns an empty list, _hlog will not produce any output. However, if the block returns at least one element, _hlog will produce at least a '# '.

The message will be output only if "$VERBOSE" is at least the given minimum verbosity level (1 by default).

If $VERBOSE > 2, the filename and line from which _hlog was called will also be printed.

Caution: Within the { } block, @_ is the arguments to that block, not the arguments to the calling function. To log @_, use something like:

my $argref = \@_;
_hlog { @$argref };

_complete_dispatcher

Makes a standard dispatcher, given code to initialize certain variables. Usage:

my $code = "...";   # See requirements below
my $subref = _complete_dispatcher($multisub_hashref, $code[, ...]);

The $code argument will be inlined as-is into the generated dispatcher. The $code must:

  • Pick which multisub candidate to use, given args in @_;

  • Put the subref of that candidate in $candidate; and

  • Put a subref in $copier of a routine that will copy from @_ into the package variables created by "import" in Sub::Multi::Tiny.

    Any arguments to _complete_dispatcher after $code are saved in my @data, which $code can access.

$code is run under strict and warnings by default. If you don't want those, you need to expressly turn them off.

_make_positional_copier

Make a sub to copy from @_ into package variables. The resulting sub copies positional parameters. Usage:

my $coderef = _make_positional_copier($defined_in, $impl_hashref);

The copier is run under strict and warnings, for what it's worth.

AUTHOR

Chris White <cxw@cpan.org>

LICENSE

Copyright (C) 2019 Chris White <cxw@cpan.org>

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.