|
NAMEApp::CLI::Extension - for App::CLI extension moduleVERSION1.421SYNOPSIS# MyApp.pm package MyApp; use strict; use base qw(App::CLI::Extension); # extension method # load App::CLI::Plugin::Foo, MyApp::Plugin::Bar __PACKAGE__->load_plugins(qw(Foo +MyApp::Plugin::Bar)); # extension method __PACKAGE__->config( name => "kurt" ); 1; # MyApp/Hello.pm package MyApp::Hello; use strict; use base qw(App::CLI::Command); use constant options => ("age=i" => "age"); sub run { my($self, @args) = @_; # config - App::CLI::Extension extension method(App::CLI::Extension::Component::Config) print "Hello! my name is " . $self->config->{name} . "\n"; print "age is " . "$self->{age}\n"; } # myapp #!/usr/bin/perl use strict; use MyApp; MyApp->dispatch; # execute [kurt@localhost ~] myapp hello --age=27 Hello! my name is kurt age is 27 DESCRIPTIONThe expansion module which added plug in, initial setting mechanism to App::CLIApp::CLI::Extension::Component::* modules is automatic, and it is done require (It is now Config and Stash is automatic, and it is done require) RUN PHASE+----------------------+ | ** run_method ** | | +----------------+ | | | setup phase | | | +----------------+ | | || | | +----------------+ | | | prerun phase | | | +----------------+ | | || | | +----------------+ | if anything error... +----------------+ | | run phase | | ======================> | fail phase | | +----------------+ | +----------------+ | || | set exit_value(default: 255) | +----------------+ | | | | postrun phase | | | | +----------------+ | | +----------------------+ | | | | | +----------------+ | | finish phase | <================================== + +----------------+ | exit SETUPIf you define initialization and initialization of each plug-inPRERUNIf you want the process to run before you run something in the main processingRUNProcess to define the main(require). however, $self->finished non-zero if not executedPOSTRUNAfter the run method to execute. however, $self->finished non-zero if not executedFINISHAt the end of all processingFAILsetup/prerun/run/postrun/finish processing to be executed if an exception occurs somewhere in the phase error$self->e is the App::CLI::Extension::Exception or Error::Simple instance is set METHODload_pluginsauto load and require plugin modulesExample # MyApp.pm # MyApp::Plugin::GoodMorning and App::CLI::Plugin::Config::YAML::Syck require __PACKAGE__->load_plugins(qw(+MyApp::Plugin::GoodMorning Config::YAML::Syck)); # MyApp/Plugin/GoodMorning.pm package MyApp::Plugin::GoodMorning; use strict; sub good_morning { my $self = shift; print "Good monring!\n"; } # MyApp/Hello.pm package MyApp::Hello; use strict; use base qw(App::CLI::Command); sub run { my($self, @args) = @_; $self->good_morning; } # myapp #!/usr/bin/perl use strict; use MyApp; MyApp->dispatch; # execute [kurt@localhost ~] myapp hello Good morning! configconfiguration methodExample # MyApp.pm __PACKAGE__->config( name => "kurt", favorite_group => "nirvana", favorite_song => ["Lounge Act", "Negative Creep", "Radio Friendly Unit Shifter", "You Know You're Right"] ); # MyApp/Hello.pm package MyApp::Hello; use strict; use base qw(App::CLI::Command); sub run { my($self, @args) = @_; print "My name is " . $self->config->{name} . "\n"; print "My favorite group is " . $self->config->{favorite_group} . "\n"; print "My favorite song is " . join(",", @{$self->config->{favorite_song}}); print " and Smells Like Teen Spirit\n" } # myapp #!/usr/bin/perl use strict; use MyApp; MyApp->dispatch; # execute [kurt@localhost ~] myapp hello My name is kurt My favorite group is nirvana My favorite song is Lounge Act,Negative Creep,Radio Friendly Unit Shifter,You Know You're Right and Smells Like Teen Spirit COMPONENT METHODargv0my script nameExample: # MyApp/Hello.pm package MyApp::Hello; use strict; use feature ":5.10.0"; use base qw(App::CLI::Command); sub run { my($self, @args) = @_; say "my script name is " . $self->argv0; } 1; # execute [kurt@localhost ~] myapp hello my script name is myapp full_argv0my script fullnameExample: # MyApp/Hello.pm package MyApp::Hello; use strict; use feature ":5.10.0"; use base qw(App::CLI::Command); sub run { my($self, @args) = @_; say "my script full name is " . $self->full_argv0; } 1; # execute [kurt@localhost ~] myapp hello my script name is /home/kurt/myapp cmdlinemy execute cmdline stringExample: # MyApp/Hello.pm package MyApp::Hello; use strict; use feature ":5.10.0"; use base qw(App::CLI::Command); sub run { my($self, @args) = @_; say "my script cmdline is [" . $self->cmdline . "]"; } 1; # execute [kurt@localhost ~] myapp hello --verbose --num=10 my script cmdline is [/home/kurt/myapp hello --verbose --num=10] orig_argvmy execute script original argvExample: # MyApp/Hello.pm package MyApp::Hello; use strict; use feature ":5.10.0"; use base qw(App::CLI::Command); sub run { my($self, @args) = @_; say "my script original argv is [" join(", ", @{$self->orig_argv}) . "]"; } 1; # execute [kurt@localhost ~] myapp hello --verbose --num=10 my script original argv is [hello,--verbose, --num=10] stashlike global variable in Command packageExample: # MyApp/Hello.pm package MyApp::Hello; use strict; use feature ":5.10.0"; use base qw(App::CLI::Command); sub run { my($self, @args) = @_; $self->stash->{name} = "kurt"; say "stash value: " . $self->stash->{name}; } 1; new_callbackinstall new callback phaseExample: $self->new_callback("some_phase"); # registered callback argument pattern $self->new_callback("some_phase", sub { $self = shift; "anything to do..." }); add_callbackinstall callbackExample: $self->add_callback("some_phase", sub { my $self = shift; say "some_phase method No.1" }); $self->add_callback("some_phase", sub { my $self = shift; say "some_phase method No.1" }); $self->add_callback("any_phase", sub { my($self, @args) = @_; say "any_phase args: @args"; }); exec_callbackexecute callbackExample: $self->execute_callback("some_phase"); # some_phase method method No.1 # some_phase method method No.2 $self->execute_callback("any_phase", qw(one two three)); # any_phase args: one two three exists_callbackexists callback checkExample: if ($self->exists_callback("some_phase")) { $self->exec_callback("some_phase"); } else { die "some_phase is not exists callback phase"; } exit_valueset exit valueExample: # program exit value is 1(ex. echo $?) $self->exit_value(1); finishedsetup or prepare phase and 1 set, run and postrun phase will not run. default 0Example: # MyApp/Hello.pm package MyApp::Hello; use strict; use base qw(App::CLI::Command); sub prerun { my($self, @args) = @_; $self->finished(1); } # non execute sub run { my($self, @args) = @_; print "hello\n"; } throwraises an exception, fail phase transitionsExample: # MyApp/Hello.pm package MyApp::Hello; use strict; use base qw(App::CLI::Command); sub run { my($self, @args) = @_; my $file = "/path/to/file"; open my $fh, "< $file" or $self->throw("can not open file:$file"); while ( my $line = <$fh> ) { chomp $line; print "$line\n"; } close $fh; } # transitions fail phase method sub fail { my($self, @args) = @_; # e is App:CLI::Extension::Exception instance printf "ERROR: %s", $self->e; printf "STACKTRACE: %s", $self->e->stacktrace; } # myapp #!/usr/bin/perl use strict; use MyApp; MyApp->dispatch; # execute [kurt@localhost ~] myapp hello ERROR: can not open file:/path/to/file at lib/MyApp/Throw.pm line 10. STACKTRACE: can not open file:/path/to/file at lib/MyApp/Throw.pm line 10 MyApp::Throw::run('MyApp::Throw=HASH(0x81bd6b4)') called at /usr/lib/perl5/site_perl/5.8.8/App/CLI/Extension/Component/RunCommand.pm line 36 App::CLI::Extension::Component::RunCommand::run_command('MyApp::Throw=HASH(0x81bd6b4)') called at /usr/lib/perl5/site_perl/5.8.8/App/CLI/Extension.pm line 177 App::CLI::Extension::dispatch('MyApp') called at ./myapp line 7 when you run throw method, App::CLI::Extension::Exception instance that $self->e is set to. App::CLI::Extension::Exception is the Error::Simple is inherited. refer to the to documentation of "Error" throw method without running CORE::die if you run the $self->e is the Error::Simple instance will be set eApp::CLI::Extension::Exception or Error::Simple instance. There is a ready to use, fail phase onlyRUN PHASE METHODsetupprerunpostrunfinishprogram last phase. By default, the exit will be executed automatically, exit if you do not want the APPCLI_NON_EXIT environ valiable how do I set the (value is whatever)failerror phase. default exit value is 255. if you want to change exit_value, see exit_value manualSEE ALSOApp::CLI Class::Accessor::Grouped UNIVERSAL::requireAUTHORAkira HorimotoCOPYRIGHT AND LICENSEThis library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.Copyright (C) 2009 Akira Horimoto
Visit the GSP FreeBSD Man Page Interface. |