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   884845 use 5.008001;
  25         187  
2 25     25   129 use strict;
  25         73  
  25         640  
3 25     25   129 use warnings;
  25         63  
  25         1464  
4              
5             package Log::Any;
6              
7             # ABSTRACT: Bringing loggers and listeners together
8             our $VERSION = '1.715';
9              
10 25     25   10587 use Log::Any::Manager;
  25         51  
  25         735  
11 25     25   9886 use Log::Any::Proxy::Null;
  25         66  
  25         964  
12 25         8743 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   192 );
  25         47  
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   603 sub _manager { return $manager }
30 3     3 0 27 sub has_consumer { $manager->has_consumer }
31             }
32              
33             sub import {
34 38     38   342 my $class = shift;
35 38         101 my $caller = caller();
36              
37 38         111 my @export_params = ( $caller, @_ );
38 38         97 $class->_export_to_caller(@export_params);
39             }
40              
41             sub _export_to_caller {
42 38     38   74 my $class = shift;
43 38         59 my $caller = shift;
44              
45             # Parse parameters passed to 'use Log::Any'
46 38         154 my $saw_log_param;
47             my @params;
48 38         140 while ( my $param = shift @_ ) {
49 23 100 66     180 if ( !$saw_log_param && $param =~ /^\$(\w+)/ ) {
50 17         50 $saw_log_param = $1; # defer until later
51 17         61 next; # singular
52             }
53             else {
54 6         37 push @params, $param, shift @_; # pairwise
55             }
56             }
57              
58 38 50       182 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       5664 if ( defined $saw_log_param ) {
65 25     25   227 no strict 'refs';
  25         68  
  25         3172  
66 17         47 my $proxy = $class->get_logger( category => $caller, @params );
67 17         53 my $varname = "${caller}::${saw_log_param}";
68 17         15086 *$varname = \$proxy;
69             }
70             }
71              
72             sub get_logger {
73 64     64 0 8335 my ( $class, %params ) = @_;
74 25     25   192 no warnings 'once';
  25         86  
  25         8834  
75              
76             my $category =
77 64 100       231 defined $params{category} ? delete $params{'category'} : caller;
78 64 100       189 if ( my $default = delete $params{'default_adapter'} ) {
79 4         7 my @default_adapter_params = ();
80 4 100       14 if (ref $default eq 'ARRAY') {
81 1         1 ($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         16 $category, $default, @default_adapter_params
90             );
91             }
92              
93 64         238 my $proxy_class = $class->_get_proxy_class( delete $params{proxy_class} );
94              
95 64         190 my $adapter = $class->_manager->get_adapter( $category );
96 64         175 my $context = $class->_manager->get_context();
97              
98 64         207 require_dynamic($proxy_class);
99 64         307 return $proxy_class->new(
100             %params, adapter => $adapter, category => $category, context => $context
101             );
102             }
103              
104             sub _get_proxy_class {
105 64     64   138 my ( $self, $proxy_name ) = @_;
106 64 100       160 return $Log::Any::OverrideDefaultProxyClass
107             if $Log::Any::OverrideDefaultProxyClass;
108 37 100 100     136 return "Log::Any::Proxy" if !$proxy_name && _manager->has_consumer;
109 13 100       67 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 1176 my $class = shift;
121 1         5 Log::Any->_manager->set(@_);
122             }
123              
124             1;
125              
126             __END__