From Code to Community: Sponsoring The Perl and Raku Conference 2025 Learn more

use strict;
$Footprintless::App::DocumentationUtil::VERSION = '1.29';
# ABSTRACT: A utility class for generating help documentation from POD
# PODNAME: Footprintless::App::DocumentationUtil
use Exporter qw(import);
my $logger = Log::Any->get_logger();
our @EXPORT_OK = qw(
abstract
description
examples
pod_section
);
sub abstract {
my ($self_or_class) = @_;
my $pm_file = _pm_file($self_or_class);
return '(unknown)' unless ($pm_file);
return Footprintless::Util::slurp($pm_file) =~ /^#+\s*ABSTRACT: (.*)$/m ? $1 : '(unknown)';
}
sub description {
return pod_section( $_[0], 'DESCRIPTION', 0, qr/Description:\n/ );
}
sub examples {
return pod_section( $_[0], 'EXAMPLES' );
}
sub pod_section {
my ( $self_or_class, $section, $indent, $remove ) = @_;
my $pm_file = _pm_file($self_or_class)
|| return $self_or_class->abstract();
my $pod = '';
open( my $output, '>', \$pod );
require Pod::Usage;
Pod::Usage::pod2usage(
-input => $pm_file,
-output => $output,
-exit => "NOEXIT",
-verbose => 99,
-sections => $section,
indent => $indent
);
if ($pod) {
$pod =~ s/$remove//m if ($remove);
chomp($pod);
}
return $pod;
}
sub _pm_file {
my ($self_or_class) = @_;
my $class = ref($self_or_class) || $self_or_class;
my @pm_file_parts = split( /::/, $class );
$pm_file_parts[$#pm_file_parts] .= '.pm';
my $pm_file = File::Spec->catfile(@pm_file_parts);
my $path = $INC{$pm_file};
unless ($path) {
foreach my $prefix (@INC) {
my $prefix_path = File::Spec->catfile( $prefix, $pm_file );
if ( -f $prefix_path ) {
$path = $prefix_path;
last;
}
}
}
return $path;
}
1;
__END__
=pod
=head1 NAME
Footprintless::App::DocumentationUtil - A utility class for generating help documentation from POD
=head1 VERSION
version 1.29
=head1 EXPORT_OK
=head2 abstract($self_or_class)
Returns the content of the C<ABSTRACT> section of the pod for
C<$self_or_class>.
=head2 description($self_or_class)
Returns the content of the C<DESCRIPTION> section of the pod for
C<$self_or_class>.
=head2 examples($self_or_class)
Returns the content of the C<EXAMPLES> section of the pod for
C<$self_or_class>.
=head2 pod_section($self_or_class, $section, $indent, $remove)
Returns the content of the C<$section> section of the pod for
C<$self_or_class> with indent level C<$indent>. If specified,
C<$remove> a regex used to find content to remove.
=head1 AUTHOR
Lucas Theisen <lucastheisen@pastdev.com>
=head1 COPYRIGHT AND LICENSE
This software is copyright (c) 2016 by Lucas Theisen.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
=head1 SEE ALSO
Please see those modules/websites for more information related to this module.
=over 4
=item *
L<Footprintless|Footprintless>
=back
=cut