File Coverage

blib/lib/Log/Any.pm
Criterion Covered Total %
statement 63 65 96.9
branch 18 20 90.0
condition 5 6 83.3
subroutine 15 15 100.0
pod 0 3 0.0
total 101 109 92.6


line stmt bran cond sub pod time code
1 25     25   886379 use 5.008001;
  25         237  
2 25     25   133 use strict;
  25         52  
  25         714  
3 25     25   128 use warnings;
  25         57  
  25         1466  
4              
5             package Log::Any;
6              
7             # ABSTRACT: Bringing loggers and listeners together
8             our $VERSION = '1.716';
9              
10 25     25   10120 use Log::Any::Manager;
  25         59  
  25         739  
11 25     25   10069 use Log::Any::Proxy::Null;
  25         86  
  25         1114  
12 25         8647 use Log::Any::Adapter::Util qw(
13             require_dynamic
14             detection_aliases
15             detection_methods
16             log_level_aliases
17             logging_aliases
18             logging_and_detection_methods
19             logging_methods
20 25     25   179 );
  25         51  
21              
22             # This is overridden in Log::Any::Test
23             our $OverrideDefaultAdapterClass;
24             our $OverrideDefaultProxyClass;
25              
26             # singleton and accessor
27             {
28             my $manager = Log::Any::Manager->new();
29 212     212   638 sub _manager { return $manager }
30 3     3 0 11 sub has_consumer { $manager->has_consumer }
31             }
32              
33             sub import {
34 38     38   362 my $class = shift;
35 38         87 my $caller = caller();
36              
37 38         110 my @export_params = ( $caller, @_ );
38 38         118 $class->_export_to_caller(@export_params);
39             }
40              
41             sub _export_to_caller {
42 38     38   70 my $class = shift;
43 38         61 my $caller = shift;
44              
45             # Parse parameters passed to 'use Log::Any'
46 38         137 my $saw_log_param;
47             my @params;
48 38         146 while ( my $param = shift @_ ) {
49 23 100 66     181 if ( !$saw_log_param && $param =~ /^\$(\w+)/ ) {
50 17         63 $saw_log_param = $1; # defer until later
51 17         59 next; # singular
52             }
53             else {
54 6         34 push @params, $param, shift @_; # pairwise
55             }
56             }
57              
58 38 50       164 unless ( @params % 2 == 0 ) {
59 0         0 require Carp;
60 0         0 Carp::croak("Argument list not balanced: @params");
61             }
62              
63             # get logger if one was requested
64 38 100       5742 if ( defined $saw_log_param ) {
65 25     25   240 no strict 'refs';
  25         88  
  25         3082  
66 17         47 my $proxy = $class->get_logger( category => $caller, @params );
67 17         53 my $varname = "${caller}::${saw_log_param}";
68 17         15484 *$varname = \$proxy;
69             }
70             }
71              
72             sub get_logger {
73 64     64 0 7434 my ( $class, %params ) = @_;
74 25     25   190 no warnings 'once';
  25         59  
  25         8714  
75              
76             my $category =
77 64 100       235 defined $params{category} ? delete $params{'category'} : caller;
78 64 100       184 if ( my $default = delete $params{'default_adapter'} ) {
79 4         7 my @default_adapter_params = ();
80 4 100       16 if (ref $default eq 'ARRAY') {
81 1         2 ($default, @default_adapter_params) = @{ $default };
  1         5  
82             }
83             # Every default adapter is set only for a given logger category.
84             # When another adapter is configured (by using
85             # Log::Any::Adapter->set) for this category, it takes
86             # precedence, but if that adapter is later removed, the default
87             # we set here takes over again.
88             $class->_manager->set_default(
89 4         51 $category, $default, @default_adapter_params
90             );
91             }
92              
93 64         262 my $proxy_class = $class->_get_proxy_class( delete $params{proxy_class} );
94              
95 64         169 my $adapter = $class->_manager->get_adapter( $category );
96 64         177 my $context = $class->_manager->get_context();
97              
98 64         226 require_dynamic($proxy_class);
99 64         326 return $proxy_class->new(
100             %params, adapter => $adapter, category => $category, context => $context
101             );
102             }
103              
104             sub _get_proxy_class {
105 64     64   136 my ( $self, $proxy_name ) = @_;
106 64 100       186 return $Log::Any::OverrideDefaultProxyClass
107             if $Log::Any::OverrideDefaultProxyClass;
108 37 100 100     137 return "Log::Any::Proxy" if !$proxy_name && _manager->has_consumer;
109 13 100       108 return "Log::Any::Proxy::Null" if !$proxy_name;
110 3 50       17 my $proxy_class = (
111             substr( $proxy_name, 0, 1 ) eq '+'
112             ? substr( $proxy_name, 1 )
113             : "Log::Any::Proxy::$proxy_name"
114             );
115 3         8 return $proxy_class;
116             }
117              
118             # For backward compatibility
119             sub set_adapter {
120 1     1 0 928 my $class = shift;
121 1         3 Log::Any->_manager->set(@_);
122             }
123              
124             1;
125              
126             __END__