=pod

=head1 NAME

[@$og{package}@] - [@$og{purpose}@]

=head1 VERSION

Version [@$og{version}@]

=head1 SYNOPSIS

 [@
  $OUT .= $og{package};
  $OUT .= ' [OPTIONS]' if (@{$og{optl}});
  if ($og{unnamed}) {
    if (@{$og{args}}) {
      $OUT .= join("", map { " $_->{name}" } @{$og{args}});
    }
    else {
      $OUT .= " FILE(s)...";
    }
  }

 @]
 [@
   #// -- summary: argument descriptions
   if ($og{unnamed} && @{$og{args}}) {
     my ($arg,$maxarglen);
     #// -- get argument field-lengths
     foreach $arg (@{$og{args}}) {
      $maxarglen = length($arg->{name})
	if (!defined($maxarglen) || $maxarglen < length($arg));
     }
     $OUT .=
       join("\n ",
	    "",
	    q{Arguments:},
	    map {
	      sprintf("   %-${maxarglen}s  %s", $_->{name}, $_->{descr})
	    } @{$og{args}});
   }

    #// -- summary: option descriptions
    if (@{$og{optl}}) {
      #// -- get option field-lengths
      my ($optid,$opt,$maxshortlen,$maxlonglen,$oshortlen,$olonglen);
      my ($short,$long,$descr);
      foreach $opt (values(%{$og{opth}})) {
	$oshortlen = defined($opt->{short}) ? 2 : 0;
	$olonglen = defined($opt->{long}) ? length($opt->{long}) : 0;
	if ($opt->{arg}) {
	  $oshortlen += length($opt->{arg});
	  $olonglen += 1+length($opt->{arg});
	}
	$maxshortlen = $oshortlen
	  if (!defined($maxshortlen) || $maxshortlen < $oshortlen);
	$maxlonglen = $olonglen
	  if (!defined($maxlonglen) || $maxlonglen < $olonglen);
      }
      #// -- print option summary
      my $group = '';
      foreach $optid (@{$og{optl}}) {
	$opt = $og{opth}{$optid};
	if ($opt->{group} ne $group) {
          #// -- print group header
	  $group = $opt->{group};
	  $OUT .= "\n\n $group";
	}
        #// -- print option
	$short = $long = $descr = '';
	if (defined($opt->{short}) && $opt->{short} ne '-') {
	  $short = "-$opt->{short}";
	  $short .= $opt->{arg} if (defined($opt->{arg}));
	}
	if (defined($opt->{long}) && $opt->{long} ne '-') {
	  $long = $opt->{long};
	  $long = '--'.OptGen::string_value($long);
	  $long .= '='.$opt->{arg} if (defined($opt->{arg}));
	}
	next if ($short eq '' && !$og{longhelp});
	$OUT .= ("\n    "
		 .sprintf("%-${maxshortlen}s", $short)
		 .($og{longhelp} ? sprintf("  %-${maxlonglen}s", $long) : '')
		 .'  '.$opt->{descr});
      }
    }
  @]

=cut

###############################################################
# Description
###############################################################
=pod

=head1 DESCRIPTION

[@ $og{purpose} ? $og{purpose} : '' @]

[@ $og{details} ? $og{details} : '' @]

Documentation autogenerated by [@$og{name}@] version [@$og{OptGenVersion}@]
with the following command:

 [@$CMDLINE@]

=cut

###############################################################
# Arguments
###############################################################
=pod

[@
  if ($og{unnamed}) {
    $OUT .= "=head1 ARGUMENTS\n\n=over 4\n\n";
    if (@{$og{args}}) {
      foreach my $arg (@{$og{args}}) {
        my ($name,$descr) = @$arg{qw(name descr)};
        $OUT .= ("=item * C<".OptGen::podify($name).">\n\n".OptGen::podify($descr)."\n\n");
      }
    } else {
     $OUT .= "=item * C<FILE(s)>\n\nInput files.\n\n";
    }
  }
  $OUT .= "=back\n\n";
@]

=cut


###############################################################
# Options
###############################################################
=pod

[@
  if (@{$og{optl}}) {
    $OUT .= "=head1 OPTIONS\n\n=over 4\n\n";
      my $group = 'Options'; ## -- use the default
      my ($short,$long,$descr,$optid,$opt);
      foreach $optid (@{$og{optl}}) {
	$opt = $og{opth}{$optid};
	if ($opt->{group} ne $group) {
	  $group = $opt->{group};
          #// -- print last-group footer
          $OUT .= "=back\n\n=cut\n\n";
          #// -- print new-group header
          $OUT .= ('#'.('-' x 62)."\n"
                   ."# Option-Group $group\n"
                   .'#'.('-' x 62)."\n"
                   ."=pod\n\n=head2 $group\n\n=over 4\n\n");
	}
        #// -- print option
	$short = $long = $descr = '';
	if (defined($opt->{short}) && $opt->{short} ne '-') {
	  $short = "-$opt->{short}";
	  $short .= $opt->{arg} if (defined($opt->{arg}));
	}
	if (defined($opt->{long}) && $opt->{long} ne '-') {
	  $long = $opt->{long};
	  $long = '--'.OptGen::string_value($long);
	  $long .= '='.$opt->{arg} if (defined($opt->{arg}));
	}
	$OUT .= ("=item * "
                 .join(" , ",
		       ($long ? ("C<".OptGen::podify($long).">") : qw()),
		       ($short ? ("C<".OptGen::podify($short).">") : qw()))
		 ."\n\n"
		 .(defined($opt->{descr}) ? (OptGen::podify($opt->{descr})."\n\n") : '')
                 .(defined($opt->{details}) ? (OptGen::podify($opt->{details})."\n\n") : '')
		 ."\n\n");
      }
  }
  #// -- print last-group footer
  $OUT .= "=back\n\n";
@]

=cut

###############################################################
# Bugs
###############################################################
=pod

=head1 BUGS

[@
  if ($bugfile) {
    eval "use IO::File;";
    $bugfh = IO::File->new("<$bugfile") or die("could not open bugfile '$bugfile': $!");
    $OUT .= join(" ",<$bugfh>);
    $bugfh->close()
  } else {
    $OUT .= "Unknown.\n";
  }
@]

=cut

###############################################################
# Footer
###############################################################
=pod

[@
  if ($footerfile) {
    eval "use IO::File;";
    $footfh = IO::File->new("<$footerfile") or die("could not open footer file '$footerfile': $!");
    $OUT .= join(" ",<$footfh>);
    $footfh->close()
  } else {
    $OUT .= '

=head1 ACKNOWLEDGEMENTS

perl by Larry Wall.

=head1 AUTHOR

A. U. Thor, E<lt>a.u.thor@a.galaxy.far.far.awayE<gt>

=head1 SEE ALSO

L<perl>.

=cut

'
  }

@]
