File Coverage

blib/lib/Log/Any/Adapter/Carp.pm
Criterion Covered Total %
statement 61 61 100.0
branch 20 24 83.3
condition 4 5 80.0
subroutine 13 13 100.0
pod 0 1 0.0
total 98 104 94.2


line stmt bran cond sub pod time code
1             #!perl
2             #
3              
4 3     3   1672 use strict;
  3         4  
  3         71  
5 3     3   10 use warnings;
  3         2  
  3         176  
6              
7             package Log::Any::Adapter::Carp;
8              
9             our ($VERSION) = '1.03';
10             our (@CARP_NOT) = ( __PACKAGE__, 'Log::Any::Proxy' );
11              
12 3     3   9 use Scalar::Util qw(reftype);
  3         3  
  3         209  
13 3     3   13 use Log::Any::Adapter::Util 1;
  3         57  
  3         93  
14              
15 3     3   1218 use parent 'Log::Any::Adapter::Base';
  3         699  
  3         12  
16              
17             sub init {
18 16     16 0 6781 my ($self) = @_;
19 16         18 my $i = 1;
20 16         7 my $callpack;
21             my $logger;
22              
23 16         12 do { $callpack = caller( $i++ ) } while $callpack =~ /^Log::Any::/;
  76         171  
24              
25 16 50       32 $self->{log_level} = 'trace' unless exists $self->{log_level};
26             $self->{log_level} =
27             Log::Any::Adapter::Util::numeric_level( $self->{log_level} )
28 16 50       58 unless $self->{log_level} =~ /^\d+$/;
29              
30 16 100 100     153 if ( $self->{no_trace} ) {
    100          
31             $self->{send_msg} = sub {
32 1   50 1   3 my $text = shift || '';
33 1 50       3 $text .= "\n" unless $text =~ /\n$/;
34 1         16 warn $text;
35 1         4 };
36             }
37             elsif ( $self->{skip_packages}
38             and reftype( $self->{skip_packages} ) eq 'REGEXP' )
39             {
40             my $skipadd = '|^Log::Any::|^Carp::Clan::'
41 6 50       12 . ( $self->{skip_me} ? "|^$callpack\$" : '' );
42 6         30 my $skipre = qr/$self->{skip_packages}$skipadd/;
43              
44 6         19 require Carp::Clan;
45             {
46              
47 6         6 package Log::Any::Adapter::Carp::Clannish;
48 6         11 Carp::Clan->import($skipre);
49             }
50 3     3   712 no warnings 'once';
  3         4  
  3         675  
51             $self->{send_msg} =
52             $self->{full_trace}
53 6 100       537 ? *Log::Any::Adapter::Carp::Clannish::cluck
54             : *Log::Any::Adapter::Carp::Clannish::carp;
55             }
56             else {
57 9         52 require Carp;
58             {
59              
60 9         7 package Log::Any::Adapter::Carp::Carpish;
61 9         162 Carp->import(qw/ carp cluck /);
62             }
63              
64 9         11 my @skip_pkgs;
65             push @skip_pkgs, $callpack
66 9 100       17 if $self->{skip_me};
67              
68 9 100       14 if ( exists $self->{skip_packages} ) {
69 3 100       24 if ( reftype $self->{skip_packages} eq 'ARRAY' ) {
70 1         1 push @skip_pkgs, @{ $self->{skip_packages} };
  1         2  
71             }
72             else {
73 2         8 push @skip_pkgs, $self->{skip_packages};
74             }
75             }
76              
77             my $carp =
78             $self->{full_trace}
79 9 100       21 ? *Log::Any::Adapter::Carp::Carpish::cluck
80             : *Log::Any::Adapter::Carp::Carpish::carp;
81              
82             $self->{send_msg} = sub {
83              
84             # Ugh, but this is the only Carp mechanism to keep a package out
85             # of the shortmess if the call is *from* it
86 7     7   10 local %Carp::Internal;
87 7         14 $Carp::Internal{$_}++ for @skip_pkgs;
88 7         866 $carp->(@_);
89             }
90 9         54 }
91              
92             }
93              
94             foreach my $method ( Log::Any::Adapter::Util::logging_methods() ) {
95 3     3   11 no strict 'refs';
  3         3  
  3         235  
96             my $method_level = Log::Any::Adapter::Util::numeric_level($method);
97             *{$method} = sub {
98 11     11   1096 my $self = shift;
99 11 100       25 return if $method_level > $self->{log_level};
100 10         14 $self->{send_msg}->(@_);
101             };
102             }
103              
104             foreach my $method ( Log::Any::Adapter::Util::detection_methods() ) {
105 3     3   10 no strict 'refs';
  3         7  
  3         242  
106             my $base = substr( $method, 3 );
107             my $method_level = Log::Any::Adapter::Util::numeric_level($base);
108             *{$method} = sub {
109 9     9   2566 return !!( $method_level <= $_[0]->{log_level} );
110             };
111             }
112              
113             1;
114              
115             __END__