package App::CLI::Helper; use strict; use warnings; use File::Basename qw( basename ); sub import { no strict 'refs'; my $caller = caller; for (qw(commands files prog_name)) { *{ $caller . "::$_" } = *$_; } } =head3 commands() List the application commands. =cut sub commands { my ( $class, $include_alias ) = @_; my $dir = ref($class) || $class; $dir =~ s{::}{/}g; $dir = $INC{ $dir . '.pm' }; $dir =~ s/\.pm$//; my @cmds = map { ($_) = m{^\Q$dir\E/(.*)\.pm}; lc($_) } $class->files; if ( $include_alias and ref $class and $class->can('alias') ) { my %aliases = $class->alias; push @cmds, $_ foreach keys %aliases; } my @sorted_cmds = sort @cmds; return @sorted_cmds; } =head3 prog_name() The name of the program running your application. This will default to C, but can be overridden from within your application. =cut { my $default; sub prog_name { my $self = shift; $default = basename $0 unless $default; return $default unless ref $self; return $self->{prog_name} if defined $self->{prog_name}; $self->{prog_name} = basename $0; return $self->{prog_name}; } } =head3 files() Return module files of subcommands of first level =cut sub files { my $class = shift; $class = ref($class) if ref($class); $class =~ s{::}{/}g; my $dir = $INC{ $class . '.pm' }; $dir =~ s/\.pm$//; my @sorted_files = sort glob("$dir/*.pm"); return @sorted_files; } 1;