The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

Package::Transporter::Rule::Standard - standard rule class

SYNOPSIS

        use Package::Transporter::Rule;

        my $rule = Package::Transporter::Rule->new
                ($generator, $pkg_match, $sub_match, $argc_match);

DESCRIPTION

A rule is a check whether a generator should run to generate a missing subroutine. Example: a call for the missing subroutine Ex::Ample::no_such_thing(7, [8, 9]) will cause these style of checks to occur internally:

        $rule->check('Ex::Ample', 'no_such_thing', 1, 7, [8, 9]);

To create a rule object for the above example, use this class as follows:

        use Package::Transporter::Rule;
        my $rule = Package::Transporter::Rule->new
                ($generator, 'Ex::Ample', 'no_such_thing', 1, '', 'ARRAY');

However, it is not required to specify all details; normally the last item in rule creation is the subroutine name. Note that the standard rule class does not check the values of arguments, but rather the result of ref().

In order to minimize the number of rules to evaluate, they are organized in a tree by package name and subroutine name. Internally the above rule will be stored in the pre-selection tree under

        'Ex::Ample' => {'no_' => [$rule]}

This detail only needs to be considered when you write your own rules class. See the pre_select attribute in the standard class.

A Generator

Please see the documentation of the generator base class Package::Transporter::Generator.

Matching a Package

To widen the scope of a hierarchy search rule, shorten the names. Ex:: applies to all package names starting with Ex:: (no wildcard required), Ex::(A|B|C) is recognized as a regular expression and an empty package name applies to all packages. Alternatively you can specify a list of complete names (meaning these won't undergo wildcard interpretation) as an array reference.

        $pkg_match = 'The::Requesting::Package'; # exact
        $pkg_match = 'The::Requesting::'; # wildcard
        $pkg_match = 'The::Requesting(1|2)::'; # RE
        $pkg_match = ''; # wildcard, dangerous
        $pkg_match = sub { if ... return(1) ... return(0) }; # dynamic
        $pkg_match = ['Requesting1', 'Requesting2', ...]; # an array ref

Matching a Subroutine

Similarly for subroutine names (any kind of search). Specify no_ to match a name starting with no_ (partial subroutine name ending in underscore but no wildcard required), no_(parking|money) is recognized as a regular expression and an empty subroutine name applies to all subroutines. Alternatively you can specify a list of complete names (meaning these won't undergo wildcard interpretation) as an array reference.

        $sub_match = 'missing_subroutine'; # exact
        $sub_match = 'missing_'; # wildcard
        $sub_match = 'missing_(subroutine|function)'; # RE
        $sub_match = ''; # wildcard, dangerous
        $sub_match = sub { if ... return(1) ... return(0) }; # dynamic
        $sub_match = ['missing1', 'missing2', ...]; # an array ref

Matching The Argument Count

Normally not specified. Either the exact number of arguments passed or undef for any number of arguments. No syntax for 'less than' or 'more than'. Read on for dangers behind using this criteria.

Matching Types of Arguments

Normally not specified. The types of the actual call as returned by ref(). Keep in mind that subsequent calls to the subroutine might be done with different number and types of arguments, which the subroutine must also handle correctly. The subroutine is not re-defined depending on the calling context.

wantarray - not available

It is a design decision not to forward the return value of wantarray to the rule matchers. That would only cause surprising behaviour, because different variants of a subroutine could be generated depending on the context in which it is first called. wantarray was made for dynamic return values of subroutines, not for arbitrary static behaviour.

PUBLIC METHODS

The following methods belong to the public interface of Package::Transporter::Package.

check

The constructor as shown in the synopsis.

check

Called when the rule was pre-selected, should decide whether the generator applies to the missing subroutine and return the generator.

pre-select

Return string representations of the matchers for package name and subroutine name. This is for optimization purposes, so that not all rules have to be considered each time a subroutine is missing.

ANYTHING ELSE

Please see the documentation of the upstream package Package::Transporter.