package Plack::Middleware::Timed::Logger;

use 5.16.0;
use strict;
use warnings;

use parent qw(Plack::Middleware);
use Timed::Logger;

=head1 NAME

Plack::Middleware::Timed::Logger - Expose a Timed::Logger Instance in Middleware

=head1 VERSION

Version 0.0.4

=cut

our $VERSION = '0.0.4';

=head1 SYNOPSIS

    use Plack::Builder;
    builder {
      enable 'Timed::Logger';
      $app;
    };

=head1 DESCRIPTION

L<Plack::Middleware::Timed::Logger> does one thing, it places an instance of
L<Timed::Logger> into the C<$env> under C<plack.middleware.timed.logger>.
A new instance is created for each incoming request.

This middleware is intended to act as a bridge between L<Timed::Logger>, which
holds log of the events, with a reporting tool such as seen in
L<Plack::Middleware::Debug::Timed::Logger>.

Unless you are building some custom logging tools, you probably just want to
use the existing debug panel (L<Plack::Middleware::Debug::Timed::Logger>)
rather than building something custom around this middleware.

If you are using Dancer to build your web application you may want to use
L<Timed::Logger::Dancer::AdoptPlack> to help you to bridge Dancer's conrollers
with this middleware.

This module was inspired by L<Plack::Middleware::DBIC::QueryLog>.

=head1 SUBROUTINES

This middleware defines the following public subroutines

=head2 PSGI_KEY

Returns the PSGI C<$env> key under which you'd expect to find an instance of
L<Timed::Logger>.

=head2 get_logger_from_env

Given a L<Plack> C<$env>, returns a L<Timed::Logger>.
You should use this in your code that is trying to access the logger. For
example:

    use Plack::Middleware::Timed::Logger;

    sub logger {
      my ($self, $env) = @_;
      Plack::Middleware::Timed::Logger->get_logger_from_env($env);
    }

This function creates a new instance of L<Timed::Logger> if one doesn't exist already.
This is the officially supported interface for extracting a L<Timed::Logger> from a L<Plack> request.

=head2 call

An callback used by Plack to call this middleware.

=cut

sub PSGI_KEY {'plack.middleware.timed.logger'}

sub get_logger_from_env {
  my ($self, $env) = @_;
  #Create a new logger if one is not defined already
  $env->{+PSGI_KEY} ||= Timed::Logger->new();
  return $env->{+PSGI_KEY};
}

sub call {
  my ($self, $env) = @_;
  $env->{+PSGI_KEY} ||= Timed::Logger->new();
  $self->app->($env);
}

=head1 SEE ALSO

L<Timed::Logger>, L<Plack::Middleware::Debug::Timed::Logger>,
L<Timed::Logger::Dancer::AdoptPlack>

=head1 AUTHOR

Nikolay Martynov, C<< <kolya at cpan.org> >>

=head1 BUGS

Please report any bugs or feature requests to C<bug-plack-middleware-timed-logger at rt.cpan.org>, or through
the web interface at L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Plack-Middleware-Timed-Logger>.
I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.

=head1 SUPPORT

You can find documentation for this module with the perldoc command.

    perldoc Plack::Middleware::Timed::Logger


You can also look for information at:

=over 4

=item * RT: CPAN's request tracker (report bugs here)

L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=Plack-Middleware-Timed-Logger>

=item * AnnoCPAN: Annotated CPAN documentation

L<http://annocpan.org/dist/Plack-Middleware-Timed-Logger>

=item * CPAN Ratings

L<http://cpanratings.perl.org/d/Plack-Middleware-Timed-Logger>

=item * Search CPAN

L<http://search.cpan.org/dist/Plack-Middleware-Timed-Logger/>

=back


=head1 ACKNOWLEDGEMENTS

Logan Bell and Belden Lyman.

=head1 LICENSE AND COPYRIGHT

Copyright 2013 Nikolay Martynov and Shutterstock Inc (http://shutterstock.com). All rights reserved.

This program is free software; you can redistribute it and/or modify it
under the terms of either: the GNU General Public License as published
by the Free Software Foundation; or the Artistic License.

See L<http://dev.perl.org/licenses/> for more information.

=cut

1; # End of Plack::Middleware::Timed::Logger
