NAME

App::hopen::Phases - Definitions and routines for hopen phases

SYNOPSIS

Definition of hopen phases. Phase names are case-insensitive. The canonical form has only the first letter capitalized.

Phase names may only contain ASCII letters, digits, or underscore. The first character of a phase may not be a digit. This is so they can be used as identifiers if necessary.

This package also defines a special export tag, :hopenfile, for use when running hopen files. The wrapper code in App::hopen uses this tag. Hopen files themselves do not need to use this tag.

The names first, start, last, and end are reserved.

VARIABLES

@PHASES

The phases we know about, in order.

FUNCTIONS

is_phase

Return truthy if the given argument is the name of a phase we know about.

is_last_phase

Return truthy if the argument is the name of the last phase. If no argument is given, checks the current phase ("$Phase" in App::hopen::BuildSystemGlobals).

phase_idx

Get the index of the phase given as a parameter. Returns undef if none. Phases are case-insensitive.

curr_phase_idx

Get the index of the current phase.

next_phase

Get the phase after the given on. Returns undef if the argument is the last phase. Dies if the argument is not a phase.

ROUTINES FOR USE IN HOPEN FILES

These are exported if the tag :hopenfile is given on the use line.

on

Take a given action only in a specified phase. Usage examples:

on check => { foo => 42 };  # Just return the given hashref
on gen => 1337;             # Returns { Gen => 1337 }
on check => sub { return { foo => 1337 } };
    # Call the given sub and return its return value.

This is designed for use within a hopen file. See "_run_phase" in App::hopen for the execution environment on() is designed to run in.

When run as part of a hopen file, on() will skip the rest of the file if it runs. For example:

say "Hello, world!";                # This always runs
on check => { answer => $answer };  # This runs during the Check phase
on gen => { done => true };         # This runs during the Gen phase
say "Phase was neither Check nor Gen";  # Doesn't run in Check or Gen

TODO support on '!last' => ... or similar to take action when not in the given phase.