
=head1 NAME

Log::Any::Adapter::Development -- Manual for developing new Log::Any adapters

=head1 SYNOPSIS

The adapter module:

   package Log::Any::Adapter::YAL;
   use strict;
   use warnings;
   use Log::Any::Adapter::Util qw(make_method);
   use base qw(Log::Any::Adapter::Base);
   
   # Optionally initialize object
   #
   sub init {
       my ($self) = @_;

       $self->{attr} = ...;
   }
   
   # Create logging methods: debug, info, etc.
   #
   foreach my $method ( Log::Any->logging_methods() ) {
       make_method($method, sub { ... });
   }
   
   # Create detection methods: is_debug, is_info, etc.
   #
   foreach my $method ( Log::Any->detection_methods() ) {
       make_method($method, sub { ... });
   }

and the application:

   Log::Any->set_adapter('YAL');

=head1 DESCRIPTION

This document describes how to implement a new Log::Any adapter.

The easiest way to start is to look at the source of existing adapters, such as
L<Log::Any::Adapter::Log4perl|Log::Any::Adapter::Log4perl> and
L<Log::Any::Adapter::Dispatch|Log::Any::Adapter::Dispatch>.

=head1 NAMING

If you are going to publicly release your adapter, call it
'Log::Any::Adapter::I<something>' so that users can use it with

    Log::Any->set_adapter(I<something>);

If it's an internal driver, you can call it whatever you like and use it like

    Log::Any->set_adapter('+My::Log::Adapter');

=head1 BASE CLASS

All adapters must directly or indirectly inherit from
L<Log::Any::Adapter::Base|Log::Any::Adapter::Base>.

=head1 METHODS

=head2 Constructor

The constructor (C<new>) is provided by
L<Log::Any::Adapter::Base|Log::Any::Adapter::Base>. It will:

=over

=item *

place any adapter arguments into a hash, along with the category

=item *

bless the hash into your subclass

=item *

call L</init> which may be optionally provided by your subclass

=back

At this point, overriding the default constructor is not supported. Hopefully
it will not be needed.

The constructor is called whenever a log object is requested. e.g. If the
application initializes Log::Any like so:

    Log::Any->set_adapter('Log::YAL', yal_object => $yal, depth => 3);

and then a class requests a logger like so:

    package Foo;
    use Log::Any qw($log);

Then C<$log> will be populated with the return value of:

    Log::Any::Adapter::Yal->new(yal_object => $yal, depth => 3, category => 'Foo');

This is memoized, so if the same category should be requested again (e.g.
through a separate C<get_logger> call, the same object will be returned.
Therefore, you should try to avoid anything non-deterministic in your L</init>
function.

=head2 Required methods

The following methods have no default implementation, and MUST be defined by
your subclass:

=over

=item debug ($msg)

=item info ($msg)

=item notice ($msg)

=item warning ($msg)

=item error ($msg)

=item critical ($msg)

=item alert ($msg)

=item emergency ($msg)

These methods log a message at the specified level.

To help generate these methods programmatically, you can get a list of the
method names with

    Log::Any->logging_methods

=item is_debug ()

=item is_info ()

=item is_notice ()

=item is_warning ()

=item is_error ()

=item is_critical ()

=item is_alert ()

=item is_emergency ()

These methods return a boolean indicating whether the specified level is
active.

To help generate these methods programmatically, you can get a list of the
method names with

    Log::Any->detection_methods

=back

=head2 Optional methods

The following methods have no default implementation but MAY be provided by
your subclass:

=over

=item init ()

This is called after the adapter object is created and blessed into your class.
It will be a hash containing the parameters that were passed to new(). Perform
any necessary validation or initialization here.

=back

=head2 Support methods

The following methods are useful for defining adapters:

=over

=item delegate_method_to_slot ($slot, $method, $adapter_method)

Handle the specified $method by calling $adapter_method on the object contained
in $self->{$slot}.

See L<Log::Any::Adapter::Dispatch|Log::Any::Adapter::Dispatch> and
L<Log::Any::Adapter::Log4perl|Log::Any::Adapter::Log4perl> for examples of
usage.

=item Log::Any->logging_methods

Returns a list of logging methods: debug, info, etc.

=item Log::Any->detection_methods

Returns a list of detection methods: is_debug, is_info, etc.

=item Log::Any->logging_and_detection_methods

Returns a combined list of logging and detection methods.

=back

=head1 AUTHOR

Jonathan Swartz

=head1 SEE ALSO

L<Log::Any>

=head1 COPYRIGHT & LICENSE

Copyright (C) 2009 Jonathan Swartz.

Log::Any is provided "as is" and without any express or implied warranties,
including, without limitation, the implied warranties of merchantibility and
fitness for a particular purpose.

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

=cut
