File Coverage

blib/lib/Devel/Events/Filter/Warn.pm
Criterion Covered Total %
statement 1 3 33.3
branch n/a
condition n/a
subroutine 1 1 100.0
pod n/a
total 2 4 50.0


line stmt bran cond sub pod time code
1             #!/usr/bin/perl
2              
3             package Devel::Events::Filter::Warn;
4 2     2   25209 use Moose;
  0            
  0            
5              
6             use overload ();
7             use Scalar::Util qw(blessed reftype looks_like_number);
8              
9             with qw/Devel::Events::Filter::HandlerOptional/;
10              
11             has pretty => (
12             isa => "Bool",
13             is => "rw",
14             default => 1,
15             );
16              
17             has kvp => (
18             isa => "Bool",
19             is => "rw",
20             default => 1,
21             );
22              
23             has stringify => (
24             isa => "Bool",
25             is => "rw",
26             default => 0,
27             );
28              
29             sub filter_event {
30             my ( $self, @event ) = @_;
31              
32             if ( $self->pretty ) {
33             my ( $name, @data ) = @event;
34              
35             if ( $self->kvp ) {
36             my $output = "$name:";
37              
38             my $even = 1;
39             foreach my $field ( @data ) {
40             if ( $even ) {
41             $output .= " $field =>";
42             } else {
43             $output .= " " . $self->_make_printable($field) . ",";
44             }
45              
46             $even = !$even;
47             }
48              
49             $output =~ s/,$| =>$//;
50              
51             warn "$output\n";
52             } else {
53             warn "$name: " . join(" ", map { $self->_make_printable($_) } @data );
54             }
55             } else {
56             no warnings 'uninitialized';
57             warn "@event\n";
58             }
59              
60             return @event;
61             }
62              
63             sub _make_printable {
64             my ( $self, $field, $no_rec ) = @_;
65              
66             defined($field)
67             ? ( ref($field)
68             ? blessed($field)
69             ? $self->stringify ? "$field" : overload::StrVal($field)
70             : ( reftype($field) eq 'ARRAY' && !$no_rec
71             ? "[ " . join(", ", map { $self->_make_printable( $_, 1 ) } @$field ) . " ]"
72             : "$field" )
73             : ( looks_like_number($field)
74             ? $field
75             : do {
76             my $str = $field;
77             # FIXME require String::Escape
78             $str =~ s/\n/\\n/g;
79             $str =~ s/\r/\\r/g;
80             qq{"$str"}
81             } ) )
82             : "undef"
83             }
84              
85             __PACKAGE__;
86              
87             __END__
88              
89             =pod
90              
91             =head1 NAME
92              
93             Devel::Events::Filter::Warn - log every event to STDERR
94              
95             =head1 SYNOPSIS
96              
97             # can be used as a handler
98             my $h = Devel::Events::Filter::Warn->new();
99              
100             # or as a filter in a handler chain
101              
102             my $f = Devel::Events::Filter::Warn->new(
103             handler => $sub_handler,
104             );
105              
106             =head1 DESCRIPTION
107              
108             This is a very simple debugging aid to see that your filter/handler chains are
109             set up correctly.
110              
111             A useful helper function you can define is something along the lines of:
112              
113             sub _warn_events ($) {
114             my $handler = shift;
115             Devel::Events::Filter::Warn->new( handler => $handler );
116             }
117              
118             and then prefix handlers which seem to not be getting their events with
119             C<_warn_events> in the source code.
120              
121             =head1 METHODS
122              
123             =over 4
124              
125             =item filter_event @event
126              
127             calls C<warn "@event">. and returns the event unfiltered.
128              
129             =back
130              
131             =cut