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
; andPut 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 inmy @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.