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   918962 use 5.008001;
  25         216  
2 25     25   138 use strict;
  25         56  
  25         678  
3 25     25   141 use warnings;
  25         51  
  25         1577  
4              
5             package Log::Any;
6              
7             # ABSTRACT: Bringing loggers and listeners together
8             our $VERSION = '1.717';
9              
10 25     25   11082 use Log::Any::Manager;
  25         54  
  25         753  
11 25     25   10673 use Log::Any::Proxy::Null;
  25         77  
  25         1001  
12 25         8912 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   178 );
  25         54  
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   616 sub _manager { return $manager }
30 3     3 0 13 sub has_consumer { $manager->has_consumer }
31             }
32              
33             sub import {
34 38     38   355 my $class = shift;
35 38         81 my $caller = caller();
36              
37 38         148 my @export_params = ( $caller, @_ );
38 38         101 $class->_export_to_caller(@export_params);
39             }
40              
41             sub _export_to_caller {
42 38     38   77 my $class = shift;
43 38         60 my $caller = shift;
44              
45             # Parse parameters passed to 'use Log::Any'
46 38         150 my $saw_log_param;
47             my @params;
48 38         154 while ( my $param = shift @_ ) {
49 23 100 66     209 if ( !$saw_log_param && $param =~ /^\$(\w+)/ ) {
50 17         72 $saw_log_param = $1; # defer until later
51 17         64 next; # singular
52             }
53             else {
54 6         34 push @params, $param, shift @_; # pairwise
55             }
56             }
57              
58 38 50       202 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       5847 if ( defined $saw_log_param ) {
65 25     25   201 no strict 'refs';
  25         87  
  25         3223  
66 17         46 my $proxy = $class->get_logger( category => $caller, @params );
67 17         48 my $varname = "${caller}::${saw_log_param}";
68 17         15534 *$varname = \$proxy;
69             }
70             }
71              
72             sub get_logger {
73 64     64 0 7463 my ( $class, %params ) = @_;
74 25     25   202 no warnings 'once';
  25         80  
  25         9115  
75              
76             my $category =
77 64 100       229 defined $params{category} ? delete $params{'category'} : caller;
78 64 100       183 if ( my $default = delete $params{'default_adapter'} ) {
79 4         10 my @default_adapter_params = ();
80 4 100       17 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         13 $category, $default, @default_adapter_params
90             );
91             }
92              
93 64         233 my $proxy_class = $class->_get_proxy_class( delete $params{proxy_class} );
94              
95 64         169 my $adapter = $class->_manager->get_adapter( $category );
96 64         168 my $context = $class->_manager->get_context();
97              
98 64         218 require_dynamic($proxy_class);
99 64         330 return $proxy_class->new(
100             %params, adapter => $adapter, category => $category, context => $context
101             );
102             }
103              
104             sub _get_proxy_class {
105 64     64   130 my ( $self, $proxy_name ) = @_;
106 64 100       183 return $Log::Any::OverrideDefaultProxyClass
107             if $Log::Any::OverrideDefaultProxyClass;
108 37 100 100     194 return "Log::Any::Proxy" if !$proxy_name && _manager->has_consumer;
109 13 100       69 return "Log::Any::Proxy::Null" if !$proxy_name;
110 3 50       15 my $proxy_class = (
111             substr( $proxy_name, 0, 1 ) eq '+'
112             ? substr( $proxy_name, 1 )
113             : "Log::Any::Proxy::$proxy_name"
114             );
115 3         9 return $proxy_class;
116             }
117              
118             # For backward compatibility
119             sub set_adapter {
120 1     1 0 914 my $class = shift;
121 1         3 Log::Any->_manager->set(@_);
122             }
123              
124             1;
125              
126             __END__