home *** CD-ROM | disk | FTP | other *** search
/ PC World 2005 December (Special) / PCWorld_2005-12_Special_cd.bin / Bezpecnost / lsti / lsti.exe / framework-2.5.exe / GetOptsOO.pm < prev    next >
Text File  |  2005-01-27  |  3KB  |  107 lines

  1.  
  2. require 5;
  3. package Pod::Perldoc::GetOptsOO;
  4. use strict;
  5.  
  6. # Rather like Getopt::Std's getopts
  7. #  Call Pod::Perldoc::GetOptsOO::getopts($object, \@ARGV, $truth)
  8. #  Given -n, if there's a opt_n_with, it'll call $object->opt_n_with( ARGUMENT )
  9. #    (e.g., "-n foo" => $object->opt_n_with('foo').  Ditto "-nfoo")
  10. #  Otherwise (given -n) if there's an opt_n, we'll call it $object->opt_n($truth)
  11. #    (Truth defaults to 1)
  12. #  Otherwise we try calling $object->handle_unknown_option('n')
  13. #    (and we increment the error count by the return value of it)
  14. #  If there's no handle_unknown_option, then we just warn, and then increment
  15. #    the error counter
  16. #  The return value of Pod::Perldoc::GetOptsOO::getopts is true if no errors,
  17. #   otherwise it's false.
  18. #
  19. ## sburke@cpan.org 2002-10-31
  20.  
  21. BEGIN { # Make a DEBUG constant ASAP
  22.   *DEBUG = defined( &Pod::Perldoc::DEBUG )
  23.    ? \&Pod::Perldoc::DEBUG
  24.    : sub(){10};
  25. }
  26.  
  27.  
  28. sub getopts {
  29.   my($target, $args, $truth) = @_;
  30.   
  31.   $args ||= \@ARGV;
  32.  
  33.   $target->aside(
  34.     "Starting switch processing.  Scanning arguments [@$args]\n"
  35.   ) if $target->can('aside');
  36.  
  37.   return unless @$args;
  38.  
  39.   $truth = 1 unless @_ > 2;
  40.  
  41.   DEBUG > 3 and print "   Truth is $truth\n";
  42.  
  43.  
  44.   my $error_count = 0;
  45.  
  46.   while( @$args  and  ($_ = $args->[0]) =~ m/^-(.)(.*)/s ) {
  47.     my($first,$rest) = ($1,$2);
  48.     if ($_ eq '--') {    # early exit if "--"
  49.       shift @$args;
  50.       last;
  51.     }
  52.     my $method = "opt_${first}_with";
  53.     if( $target->can($method) ) {  # it's argumental
  54.       if($rest eq '') {   # like -f bar
  55.         shift @$args;
  56.         warn "Option $first needs a following argument!\n" unless @$args;
  57.         $rest = shift @$args;
  58.       } else {            # like -fbar  (== -f bar)
  59.         shift @$args;
  60.       }
  61.  
  62.       DEBUG > 3 and print " $method => $rest\n";
  63.       $target->$method( $rest );
  64.  
  65.     # Otherwise, it's not argumental...
  66.     } else {
  67.  
  68.       if( $target->can( $method = "opt_$first" ) ) {
  69.         DEBUG > 3 and print " $method is true ($truth)\n";
  70.         $target->$method( $truth );
  71.  
  72.       # Otherwise it's an unknown option...
  73.  
  74.       } elsif( $target->can('handle_unknown_option') ) {
  75.         DEBUG > 3
  76.          and print " calling handle_unknown_option('$first')\n";
  77.          
  78.         $error_count += (
  79.           $target->handle_unknown_option( $first ) || 0
  80.         );
  81.  
  82.       } else {
  83.         ++$error_count;
  84.         warn "Unknown option: $first\n";
  85.       }
  86.  
  87.       if($rest eq '') {   # like -f
  88.         shift @$args
  89.       } else {            # like -fbar  (== -f -bar )
  90.         DEBUG > 2 and print "   Setting args->[0] to \"-$rest\"\n";
  91.         $args->[0] = "-$rest";
  92.       }
  93.     }
  94.   }
  95.   
  96.  
  97.   $target->aside(
  98.     "Ending switch processing.  Args are [@$args] with $error_count errors.\n"
  99.   ) if $target->can('aside');
  100.  
  101.   $error_count == 0;
  102. }
  103.  
  104. 1;
  105.  
  106.