diff options
Diffstat (limited to 'gnu/usr.bin/perl/cpan/Pod-Perldoc/lib/Pod/Perldoc/GetOptsOO.pm')
-rw-r--r-- | gnu/usr.bin/perl/cpan/Pod-Perldoc/lib/Pod/Perldoc/GetOptsOO.pm | 161 |
1 files changed, 161 insertions, 0 deletions
diff --git a/gnu/usr.bin/perl/cpan/Pod-Perldoc/lib/Pod/Perldoc/GetOptsOO.pm b/gnu/usr.bin/perl/cpan/Pod-Perldoc/lib/Pod/Perldoc/GetOptsOO.pm new file mode 100644 index 00000000000..c77d5460483 --- /dev/null +++ b/gnu/usr.bin/perl/cpan/Pod-Perldoc/lib/Pod/Perldoc/GetOptsOO.pm @@ -0,0 +1,161 @@ +package Pod::Perldoc::GetOptsOO; +use strict; + +use vars qw($VERSION); +$VERSION = '3.17'; + +BEGIN { # Make a DEBUG constant ASAP + *DEBUG = defined( &Pod::Perldoc::DEBUG ) + ? \&Pod::Perldoc::DEBUG + : sub(){10}; +} + + +sub getopts { + my($target, $args, $truth) = @_; + + $args ||= \@ARGV; + + $target->aside( + "Starting switch processing. Scanning arguments [@$args]\n" + ) if $target->can('aside'); + + return unless @$args; + + $truth = 1 unless @_ > 2; + + DEBUG > 3 and print " Truth is $truth\n"; + + + my $error_count = 0; + + while( @$args and ($_ = $args->[0]) =~ m/^-(.)(.*)/s ) { + my($first,$rest) = ($1,$2); + if ($_ eq '--') { # early exit if "--" + shift @$args; + last; + } + if ($first eq '-' and $rest) { # GNU style long param names + ($first, $rest) = split '=', $rest, 2; + } + my $method = "opt_${first}_with"; + if( $target->can($method) ) { # it's argumental + if($rest eq '') { # like -f bar + shift @$args; + $target->warn( "Option $first needs a following argument!\n" ) unless @$args; + $rest = shift @$args; + } else { # like -fbar (== -f bar) + shift @$args; + } + + DEBUG > 3 and print " $method => $rest\n"; + $target->$method( $rest ); + + # Otherwise, it's not argumental... + } else { + + if( $target->can( $method = "opt_$first" ) ) { + DEBUG > 3 and print " $method is true ($truth)\n"; + $target->$method( $truth ); + + # Otherwise it's an unknown option... + + } elsif( $target->can('handle_unknown_option') ) { + DEBUG > 3 + and print " calling handle_unknown_option('$first')\n"; + + $error_count += ( + $target->handle_unknown_option( $first ) || 0 + ); + + } else { + ++$error_count; + $target->warn( "Unknown option: $first\n" ); + } + + if($rest eq '') { # like -f + shift @$args + } else { # like -fbar (== -f -bar ) + DEBUG > 2 and print " Setting args->[0] to \"-$rest\"\n"; + $args->[0] = "-$rest"; + } + } + } + + + $target->aside( + "Ending switch processing. Args are [@$args] with $error_count errors.\n" + ) if $target->can('aside'); + + $error_count == 0; +} + +1; + +__END__ + +=head1 NAME + +Pod::Perldoc::GetOptsOO - Customized option parser for Pod::Perldoc + +=head1 SYNOPSIS + + use Pod::Perldoc::GetOptsOO (); + + Pod::Perldoc::GetOptsOO::getopts( $obj, \@args, $truth ) + or die "wrong usage"; + + +=head1 DESCRIPTION + +Implements a customized option parser used for +L<Pod::Perldoc>. + +Rather like Getopt::Std's getopts: + +=over + +=item Call Pod::Perldoc::GetOptsOO::getopts($object, \@ARGV, $truth) + +=item Given -n, if there's a opt_n_with, it'll call $object->opt_n_with( ARGUMENT ) + (e.g., "-n foo" => $object->opt_n_with('foo'). Ditto "-nfoo") + +=item Otherwise (given -n) if there's an opt_n, we'll call it $object->opt_n($truth) + (Truth defaults to 1) + +=item Otherwise we try calling $object->handle_unknown_option('n') + (and we increment the error count by the return value of it) + +=item If there's no handle_unknown_option, then we just warn, and then increment + the error counter + +=back + +The return value of Pod::Perldoc::GetOptsOO::getopts is true if no errors, +otherwise it's false. + +=head1 SEE ALSO + +L<Pod::Perldoc> + +=head1 COPYRIGHT AND DISCLAIMERS + +Copyright (c) 2002-2007 Sean M. Burke. + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +This program is distributed in the hope that it will be useful, but +without any warranty; without even the implied warranty of +merchantability or fitness for a particular purpose. + +=head1 AUTHOR + +Current maintainer: Mark Allen C<< <mallen@cpan.org> >> + +Past contributions from: +brian d foy C<< <bdfoy@cpan.org> >> +Adriano R. Ferreira C<< <ferreira@cpan.org> >>, +Sean M. Burke C<< <sburke@cpan.org> >> + +=cut |