The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
require 5;
use 5.006;
package AnnoCPAN::Perldoc;
use strict;
use warnings;
use base 'Pod::Perldoc';

our $VERSION = '0.10';

sub maybe_generate_dynamic_pod {
    my($self, $found_things) = @_;

    if ($self->opt_f or $self->opt_q) {
        warn "Warning: -f and -q do not support annotations yet\n";
        return shift->SUPER::maybe_generate_dynamic_pod(@_);
    }

    my @dynamic_pod;
    
    $self->filter_pod($found_things, \@dynamic_pod);

    my ($buffd, $buffer) = $self->new_tempfile('pod', 'dyn');
    
    push @{ $self->{'temp_file_list'} }, $buffer;
     # I.e., it MIGHT be deleted at the end.
    
    print $buffd @dynamic_pod  or die "Can't print $buffer: $!";
    close $buffd        or die "Can't close $buffer: $!";
    
    @$found_things = $buffer;
      # Yes, so found_things never has more than one thing in
      #  it, by time we leave here
    
    $self->add_formatter_option('__filter_nroff' => 1);

    return;
}


sub filter_pod {
    my($self, $found_things, $pod) = @_;

    Pod::Perldoc::DEBUG > 2 and print "Search: @$found_things\n";

    my $file = shift @$found_things;
    open(F, "<", $file)               # "Funk is its own reward"
        or die("Can't open $file $!");

    Pod::Perldoc::DEBUG > 2 and
     print "Going to filter for $file\n";
    
    my $content = do { local $/; <F> };

    my ($filter_class) = 'AnnoCPAN::Perldoc::Filter';

    eval "require $filter_class";
    if($@) {
        die "Couldn't load filter class '$filter_class': $@\n";
    }

    my $filter = $filter_class->can('new')
        ? $filter_class->new
        : $filter_class
    ;

    @$pod = $filter->filter($content);

    close F  or die "Can't close $file $!";
    return;
}

1;

__END__

=head1 NAME

AnnoCPAN::Perldoc - Integrate AnnoCPAN notes locally into perldoc

=head1 SYNOPSYS

    # This is a fully functional 'perldoc'
    use AnnoCPAN::Perldoc;
    AnnoCPAN::Perldoc->run;

=head1 DESCRIPTION

AnnoCPAN is a web interface for the documentation of all the modules on CPAN,
where users can add annotations on the margin of specific paragraphs throughout
the POD. The master AnnoCPAN site is located at http://annocpan.org/.

AnnoCPAN-Perldoc provides a substitute for the 'perldoc' command that displays
the annotations locally and without requiring a connection to the Internet. 
It works by using a local note database that can be downloaded from

    http://annocpan.org/annopod.db

This is an SQLite3 database; the file should be saved in one of these
locations:

    $HOME
    $USERPROFILE
    $ALLUSERSPROFILE
    /var/annocpan

It can also be called .annopod.db, to hide it in Unix-like systems. It is your
resposibility to keep this file as up-to-date as you want. Future versions may
include an automatic update feature (which will require network connectivity).

=head1 SEE ALSO

L<annopod>,
L<AnnoCPAN>,
L<Pod::Perldoc>

=head1 AUTHOR

Ivan Tubert-Brohman E<lt>itub@cpan.orgE<gt>

=head1 COPYRIGHT

Copyright (c) 2005 Ivan Tubert-Brohman. All rights reserved. This program is
free software; you can redistribute it and/or modify it under the same terms as
Perl itself.

=cut