Pb
view release on metacpan or search on metacpan
package Pb;
use 5.14.0;
use warnings;
use autodie ':all';
our $VERSION = '0.02'; # VERSION
use Exporter;
our @EXPORT =
(
qw< command base_command flow >, # base structure of the command itself
qw< arg opt must_be one_of also >, # for declaring command arguments and options
qw< log_to control_via >, # attributes of the command
qw< verify SH CODE RUN >, # keywords inside a flow
qw< $FLOW %OPT >, # variable containers that flows need access to
qw< pwd >, # pass-through from PerlX::bash
);
use Moo;
use CLI::Osprey;
use Safe::Isa;
use Type::Tiny;
use PerlX::bash 0.05 qw< bash pwd >;
use Import::Into;
use Sub::Install qw< install_sub >;
use File::Basename;
use Pb::Command::Context;
sub import
{
my $caller = caller;
_setup_signal_handlers();
strict->import::into($caller);
warnings->import::into($caller);
feature->import::into($caller, ':5.14');
autodie->import::into({level=>1}, ':all'); # `autodie` requires a bit of magic ...
goto \&Exporter::import;
}
# This is a global, sort of ... it has a global lifetime, certainly, but not global visibility.
# Think of it like a singleton. Most of our methods can either be called as object methods, in
# which case they operate on the object invocant, or just as straight functions, in which case they
# operate on this guy. `$CMD` is set by `Pb->go` (which is down at the very bottom of this file).
my $CMD;
# And this is how we implement that optional invocant.
sub _pb_args { $_[0]->$_can('_osprey_config') ? @_ : ($CMD, @_) }
###################
# CONTEXT OBJECTS #
###################
# This will be cloned and have command-specific values added to it when the flow executes.
our $FLOW = Pb::Command::Context->new;
our %OPT; # key == option name, value == option value
our %CONTROL; # key == command name, value == control structure
##################
# GLOBAL OPTIONS #
##################
option pretend =>
(
is => 'ro', doc => "don't run commands; just print them",
);
option interactive =>
(
is => 'ro', doc => "only run commands if user approves each one",
);
###############
# SCAFFOLDING #
###############
# this will hold all the different flows
my %FLOWS;
# this is for the `base_command` (if there is one)
my $BASE_CMD;
# This takes an option def (i.e. a hashref built from the properties of an `opt` clause) and turns
# it into the arguments to an `option` call (`option` is defined by CLI::Osprey).
sub _option_args
{
my $def = shift;
my %props = ( is => 'ro' );
( run in 2.699 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )