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 40     40   1298616 use 5.008001;
  40         134  
2 40     40   170 use strict;
  40         72  
  40         917  
3 40     40   202 use warnings;
  40         58  
  40         2899  
4              
5             package Log::Any;
6              
7             # ABSTRACT: Bringing loggers and listeners together
8             our $VERSION = '1.718';
9              
10 40     40   15447 use Log::Any::Manager;
  40         94  
  40         1358  
11 40     40   14665 use Log::Any::Proxy::Null;
  40         104  
  40         3223  
12 40         19748 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 40     40   234 );
  40         82  
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 224     224   767 sub _manager { return $manager }
30 3     3 0 15 sub has_consumer { $manager->has_consumer }
31             }
32              
33             sub import {
34 41     41   483 my $class = shift;
35 41         125 my $caller = caller();
36              
37 41         166 my @export_params = ( $caller, @_ );
38 41         1972 $class->_export_to_caller(@export_params);
39             }
40              
41             sub _export_to_caller {
42 41     41   77 my $class = shift;
43 41         61 my $caller = shift;
44              
45             # Parse parameters passed to 'use Log::Any'
46 41         82 my $saw_log_param;
47             my @params;
48 41         195 while ( my $param = shift @_ ) {
49 24 100 66     1839 if ( !$saw_log_param && $param =~ /^\$(\w+)/ ) {
50 18         60 $saw_log_param = $1; # defer until later
51 18         1594 next; # singular
52             }
53             else {
54 6         19 push @params, $param, shift @_; # pairwise
55             }
56             }
57              
58 41 50       1815 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 41 100       8880 if ( defined $saw_log_param ) {
65 40     40   2421 no strict 'refs';
  40         1647  
  40         6318  
66 18         47 my $proxy = $class->get_logger( category => $caller, @params );
67 18         122 my $varname = "${caller}::${saw_log_param}";
68 18         15015 *$varname = \$proxy;
69             }
70             }
71              
72             sub get_logger {
73 68     68 0 1377043 my ( $class, %params ) = @_;
74 40     40   1880 no warnings 'once';
  40         1664  
  40         13384  
75              
76             my $category =
77 68 100       2457 defined $params{category} ? delete $params{'category'} : caller;
78 68 100       234 if ( my $default = delete $params{'default_adapter'} ) {
79 4         6 my @default_adapter_params = ();
80 4 100       10 if (ref $default eq 'ARRAY') {
81 1         2 ($default, @default_adapter_params) = @{ $default };
  1         3  
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         6 $category, $default, @default_adapter_params
90             );
91             }
92              
93 68         296 my $proxy_class = $class->_get_proxy_class( delete $params{proxy_class} );
94              
95 68         188 my $adapter = $class->_manager->get_adapter( $category );
96 68         168 my $context = $class->_manager->get_context();
97              
98 68         209 require_dynamic($proxy_class);
99 68         304 return $proxy_class->new(
100             %params, adapter => $adapter, category => $category, context => $context
101             );
102             }
103              
104             sub _get_proxy_class {
105 68     68   174 my ( $self, $proxy_name ) = @_;
106 68 100       185 return $Log::Any::OverrideDefaultProxyClass
107             if $Log::Any::OverrideDefaultProxyClass;
108 41 100 100     150 return "Log::Any::Proxy" if !$proxy_name && _manager->has_consumer;
109 17 100       70 return "Log::Any::Proxy::Null" if !$proxy_name;
110 5 50       18 my $proxy_class = (
111             substr( $proxy_name, 0, 1 ) eq '+'
112             ? substr( $proxy_name, 1 )
113             : "Log::Any::Proxy::$proxy_name"
114             );
115 5         10 return $proxy_class;
116             }
117              
118             # For backward compatibility
119             sub set_adapter {
120 2     2 0 2948 my $class = shift;
121 2         8 Log::Any->_manager->set(@_);
122             }
123              
124             1;
125              
126             __END__