Declare-CLI
view release on metacpan - search on metacpan
view release on metacpan or search on metacpan
lib/Declare/CLI.pm view on Meta::CPAN
return sub { $meta };
};
default_export arg => sub {
my ( $meta, @params ) = _parse_params(@_);
$meta->add_arg(@params);
};
default_export opt => sub {
my ( $meta, @params ) = _parse_params(@_);
$meta->add_opt(@params);
};
default_export describe_opt => sub {
my ( $meta, @params ) = _parse_params(@_);
$meta->describe( 'opt' => @params );
};
default_export describe_arg => sub {
my ( $meta, @params ) = _parse_params(@_);
$meta->describe( 'arg' => @params );
};
default_export usage => sub {
my ( $meta, @params ) = _parse_params(@_);
$meta->usage(@params);
};
for my $name (qw/ preparse parse process run handle /) {
default_export "${name}_cli" => sub {
my $consumer = shift;
my $meta = $consumer->CLI_META;
return $meta->$name( $consumer, @_ );
};
}
sub _parse_params {
my ( $first, @params ) = @_;
my $ref = ref $first;
my $type = blessed $first;
return ( $first->CLI_META, @params )
if ( $type || !$ref ) && eval { $first->can('CLI_META') };
my $meta = eval { caller(2)->CLI_META };
croak "Could not find meta data object: $@"
unless $meta;
return ( $meta, @_ );
}
sub class { shift->{class} }
sub args { shift->{args} }
sub opts { shift->{opts} }
sub _defaults { shift->{defaults} }
sub new {
my $class = shift;
my %params = @_;
my $self = bless {args => {}, opts => {}, defaults => {}} => $class;
$self->add_arg( $_ => $params{args}->{$_} ) for keys %{$params{args} || {}};
$self->add_arg( $_ => $params{opts}->{$_} ) for keys %{$params{opts} || {}};
return $self;
}
sub describe {
my $self = shift;
my ( $type, $name, $desc ) = @_;
my $meth = $type . 's';
croak "No such $type '$name'"
unless $self->$meth->{$name};
$self->$meth->{$name}->{description} = $desc if $desc;
return $self->$meth->{$name}->{description};
}
sub valid_arg_params {
return qr/^(alias|description|handler)$/;
}
sub add_arg {
my $self = shift;
my ( $name, @params ) = @_;
my %config = @params > 1 ? @params : ( handler => $params[0] );
croak "arg '$name' already defined"
if $self->args->{$name};
for my $prop ( keys %config ) {
next if $prop =~ $self->valid_arg_params;
croak "invalid arg property: '$prop'";
}
$config{name} = $name;
$config{description} ||= "No Description.";
croak "You must provide a handler"
unless $config{handler};
if ( exists $config{alias} ) {
my $aliases =
ref $config{alias}
? $config{alias}
: [$config{alias}];
$config{_alias} = {map { $_ => 1 } @$aliases};
for my $alias (@$aliases) {
croak "Cannot use alias '$alias', name is already taken by another arg."
if $self->args->{$alias};
$self->args->{$alias} = \%config;
}
}
view all matches for this distributionview release on metacpan - search on metacpan
( run in 1.133 second using v1.00-cache-2.02-grep-82fe00e-cpan-f5108d614456 )