The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package CGI::Application::Plugin::DevPopup::Log;
{
  $CGI::Application::Plugin::DevPopup::Log::VERSION = '1.08';
}

use strict;
use IO::Scalar;
use base qw/Exporter/;
use vars qw($VERSION @EXPORT);

@EXPORT = qw(devpopup_log_handle);

sub import
{
    my $c = scalar caller;
    $c->add_callback( 'devpopup_report', \&_header_report );
    goto &Exporter::import;
}

sub _header_report
{
    my $self = shift;

    my $log = _log_report($self);

    $self->devpopup->add_report(
        title => 'Logs',
        summary => '',
        report => qq(
        <style type="text/css">
        tr.even{background-color:#eee}
        </style>
        <table><thead><th colspan="1">Logs</th></thead><tbody> $log </tbody></table>
        )
    );
}

sub _log_report
{
    my $self = shift;
    my $data = $self->{__DEVPOPUP_LOGDATA};
    return '' unless (ref $data eq 'SCALAR');
    my $r=0;
    my $report = join $/, map {
                    $r=1-$r;
                    qq{<tr class="@{[$r?'odd':'even']}"><td style="white-space: pre;"> $_ </td></tr>}
                }
                split /\n/, $$data;

    return $report;
}

sub devpopup_log_handle
{
    my $this = shift;

    unless (ref $this->{__DEVPOPUP_LOGFH})
    {
        my $data = '';
        $this->{__DEVPOPUP_LOGDATA} = \$data;
        my $fh = new IO::Scalar \$data;
        $this->{__DEVPOPUP_LOGFH} = $fh;
    }

    return $this->{__DEVPOPUP_LOGFH};
}

1;    # End of CGI::Application::Plugin::DevPopup::Log

__END__

=head1 NAME

CGI::Application::Plugin::DevPopup::Log - show all data written to an IO::Scalar handle.

=head1 VERSION

version 1.08

=head1 SYNOPSIS

    use CGI::Application::Plugin::DevPopup;
    use CGI::Application::Plugin::DevPopup::Log;

    sub cgiapp_init {
        # example using LogDispatch
        my $log_fh = $this->devpopup_log_handle;
        $this->log_config(
            APPEND_NEWLINE => 1,
            LOG_DISPATCH_MODULES => [
                    {   module      => 'Log::Dispatch::Handle',
                        name        => 'popup',
                        min_level   => $ENV{CAP_DEVPOPUP_LOGDISPATCH_LEVEL} || 'debug',
                        handle      => $log_fh,
                    },
                ]
            );
        $this->log->debug("log something");
    }
    The rest of your application follows
    ...

=head1 DESCRIPTION

CGI::Application::Plugin::DevPopup::Log will create a "Log" section in the DevPopup output. All data written to the filehandle returned by C<$this-E<gt>devpopup_log_handle> will be output.

L<CGI::Application::Plugin::LogDispatch> is very handy for this, but you can write to that filehandle anyway you'd like.

=head1 METHODS

=over

=item devpopup_log_handle

Generates a (fake) filehandle you can pass on to a logging plugin. See the Synopsis for usage.

=back

=head1 SEE ALSO

    L<CGI::Application::Plugin::DevPopup>
    L<CGI::Application>
    L<CGI::Application::Plugin::LogDispatch>

=head1 AUTHOR

Joshua I Miller, L<unrtst@cpan.org>

=head1 BUGS

Please report any bugs or feature requests to
L<bug-cgi-application-plugin-devpopup@rt.cpan.org>, or through the web
interface at
L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=CGI-Application-Plugin-DevPopup>.
I will be notified, and then you'll automatically be notified of progress on
your bug as I make changes.

=head1 COPYRIGHT & LICENSE

Copyright 2007 Joshua Miller, all rights reserved.

This program is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.

=cut