App-Easer
view release on metacpan or search on metacpan
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
docs/docs/10-tutorial-base.md view on Meta::CPAN
`TuDu` package for our implementations.
We are setting a couple of high-level configurations:
- `auto-leaves`: every command without explicit children will be treated
as a leaf command, so it will not get a `help` and a `commands`
sub-commands;
- `help-on-stderr`: help messages (from `help` and `commands`) will be
printed on standard error instead of standard output. This makes it
more difficult to pipe them through a pager (like `more` or `less`),
but avoids that the help messages might be accidentally considered
part of the "real" output of the command.
The rest of the `$application` hash reference is initialized with a
skeleton of all the sub-commands that we aim to support. The structure
is pretty flat - all "real" sub-commands are in fact children to the
`MAIN` entry point.
## Setting the MAIN entry point
Let's flesh out the `MAIN` entry point. This will collect the *global*
lib/App/Easer/Tutorial/V2_008.pod view on Meta::CPAN
There are two halves to options definition inheritance: the parent marks
an option as available for inheritance setting a true value for key
C<transmit>, and the child gets it by putting its name in the list of
options (as opposed to a full hash-based definition).
=head3 Why C<transmit>? Because C<+parent>.
You might be wondering why setting options explicitly as C<transmit>
instead of providing them all and let the child command decide. This has
to do with dealing with inheritance of I<many> options all at a time.
If a child's C<options> array has this:
{
...
options => [
'+parent',
...
lib/App/Easer/Tutorial/V2_008.pod view on Meta::CPAN
=head2 Pass 8: C<aliases> and C<call_name>
Each command in L<App::Easer> supports a C<name> to set the command's
name. Many times, though, it's useful to also support I<aliases> for a
command, e.g. if you want your users to call sub-command C<list> with a
shorter version C<ls>.
Key C<aliases> in the command's specification allows setting these
aliases. As a matter of fact, you might just set it and forget about
C<name>, which will be set to the first alias in case. You decide what's
best for you:
my $app1 = {
name => 'foo',
aliases => [qw< bar baz >],
...
};
my $same_as_app1 = {
aliases => [qw< foo bar baz >],
lib/App/Easer/V2.pod view on Meta::CPAN
environment_prefix: «string»
fallback_to: «string»
force_auto_children: «boolean»
hashy_class: «string»
help_channel: «string»
name: «string»
params_validate: «hash»
sources: «array of items»
validate: «executable»
As anticipated, it's entirely up to the user to decide what style is
best, i.e. define applications through metadata only, through
object-oriented derivation, or through a mix of the two. The following
examples are aimed at producing the same application:
# metadata (mostly)
my $app_as_metadata = {
aliases => [qw< this that >],
help => 'this is the application, but also that',
options => [ { getopt => 'foo|f=s', default => 'bar' } ],
execute => sub ($app) {
( run in 2.338 seconds using v1.01-cache-2.11-cpan-de7293f3b23 )