Argv
view release on metacpan - search on metacpan
view release on metacpan or search on metacpan
# Getopt::Long::GetOptions() respects '--' but strips it, while
# we want to respect '--' and leave it in. Thus this override.
sub GetOptions {
@ARGV = map {/^--$/ ? qw(=--= --) : $_} @ARGV;
my $ret = Getopt::Long::GetOptions(@_);
@ARGV = map {/^=--=$/ ? qw(--) : $_} @ARGV;
return $ret;
}
# This method is much like the generated exec methods but has some
# special-case logic: If called with a param which is true, it starts up
# a coprocess. If called with false (aka 0) it shuts down the coprocess
# and destroys the IPC::ChildSafe object. If called with no params at
# all it returns the existing IPC::ChildSafe object.
sub ipc_childsafe {
my $self = shift;
my $ipc_state = $_[0];
my $ipc_obj;
if ($ipc_state) {
eval { require IPC::ChildSafe };
return undef if $@;
IPC::ChildSafe->VERSION(3.10);
$ipc_obj = IPC::ChildSafe->new(@_);
}
no strict 'refs';
if (ref $self) {
if (defined $ipc_state) {
$self->{_IPC_CHILDSAFE} = $ipc_obj;
return $self;
} else {
return exists($self->{_IPC_CHILDSAFE}) ?
$self->{_IPC_CHILDSAFE} : $class->{_IPC_CHILDSAFE};
}
} else {
if (defined $ipc_state) {
$class->{_IPC_CHILDSAFE} = $ipc_obj;
return $self;
} else {
return $class->{_IPC_CHILDSAFE};
}
}
}
# Class/instance method. Parses command line for e.g. -/dbg=1. See PODs.
sub attropts {
my $self = shift;
my $r_argv = undef;
my $prefix = '-/';
if (ref $_[0] eq 'HASH') {
my $cfg = shift;
$r_argv = $cfg->{ARGV};
$prefix = $cfg->{PREFIX};
}
require Getopt::Long;
local $Getopt::Long::passthrough = 1;
local $Getopt::Long::genprefix = "($prefix)";
my @flags = map {"$_=i"} ((map lc, keys %Argv::Argv), @_);
my %opt;
if (ref $self) {
if ($r_argv) {
local @ARGV = @$r_argv;
GetOptions(\%opt, @flags);
@$r_argv = @ARGV;
} else {
local @ARGV = $self->args;
if (@ARGV) {
GetOptions(\%opt, @flags);
$self->args(@ARGV);
}
}
} elsif ($r_argv) {
local @ARGV = @$r_argv;
GetOptions(\%opt, @flags);
@$r_argv = @ARGV;
} elsif (@ARGV) {
GetOptions(\%opt, @flags);
}
for my $method (keys %opt) {
$self->$method($opt{$method});
}
return $self;
}
*stdopts = \&attropts; # backward compatibility
# A class method which returns a summary of operations performed in
# printable format. Called with a void context to start data-
# collection, with a scalar context to end it and get the report.
sub summary {
my $cls = shift;
my($cmds, $operands);
if (!defined wantarray) {
$Argv::Summary = {};
return;
}
return unless $Argv::Summary;
my $fmt = "%30s: %4s\t%s\n";
my $str = sprintf $fmt, "$cls Summary", 'Cmds', 'Operands';
for (sort keys %{$Argv::Summary}) {
my @stats = @{$Argv::Summary->{$_}};
$cmds += $stats[0];
$operands += $stats[1];
$str .= sprintf $fmt, $_, $stats[0], $stats[1];
}
$str .= sprintf $fmt, 'TOTAL', $cmds, $operands if defined $cmds;
$Argv::Summary = 0;
return $str;
}
# Constructor.
sub new {
my $proto = shift;
my $attrs = shift if ref($_[0]) eq 'HASH';
my $self;
if (ref($proto)) {
# As an instance method, make a deep clone of the invoking object.
# Some cloners are fast but not commonly installed, others the
# reverse. We try them in order of speed and fall back to
# Data::Dumper which is slow but core Perl as of 5.6.0. I could
# just inherit from Clone or Storable but want to not force
# users who don't need cloning to install them.
eval {
require Clone;
Clone->VERSION(0.12); # 0.11 has a bug that breaks Argv
$self = Clone::clone($proto);
};
if ($@) {
eval {
require Storable;
$self = Storable::dclone($proto);
};
}
if ($@) {
view all matches for this distributionview release on metacpan - search on metacpan
( run in 3.437 seconds using v1.00-cache-2.02-grep-82fe00e-cpan-f5108d614456 )