File: | local/lib/perl5/Data/Printer/Filter.pm |
Coverage: | 63.3% |
line | stmt | bran | cond | sub | time | code |
---|---|---|---|---|---|---|
1 | package Data::Printer::Filter; | |||||
2 | 2 2 2 | 4 2 27 | use strict; | |||
3 | 2 2 2 | 4 0 21 | use warnings; | |||
4 | 2 2 2 | 73 1 6 | use Clone::PP qw(clone); | |||
5 | require Carp; | |||||
6 | require Data::Printer; | |||||
7 | ||||||
8 | my %_filters_for = (); | |||||
9 | my %_extras_for = (); | |||||
10 | ||||||
11 | sub import { | |||||
12 | 4 | 6 | my $caller = caller; | |||
13 | 4 | 6 | my $id = Data::Printer::_object_id( \$caller ); | |||
14 | ||||||
15 | 4 | 4 | my %properties = (); | |||
16 | ||||||
17 | my $filter = sub { | |||||
18 | 26 | 16 | my ($type, $code, $extra) = @_; | |||
19 | ||||||
20 | 26 | 76 | Carp::croak( "syntax: filter 'Class', sub { ... }" ) | |||
21 | unless $type and $code and ref $code eq 'CODE'; | |||||
22 | ||||||
23 | 26 | 15 | if ($extra) { | |||
24 | 0 | 0 | Carp::croak( 'extra filter field must be a hashref' ) | |||
25 | unless ref $extra and ref $extra eq 'HASH'; | |||||
26 | ||||||
27 | 0 | 0 | $_extras_for{$id}{$type} = $extra; | |||
28 | } | |||||
29 | else { | |||||
30 | 26 | 31 | $_extras_for{$id}{$type} = {}; | |||
31 | } | |||||
32 | ||||||
33 | 26 | 47 | unshift @{ $_filters_for{$id}{$type} }, sub { | |||
34 | 0 | 0 | my ($item, $p) = @_; | |||
35 | ||||||
36 | # send our closured %properties var instead | |||||
37 | # so newline(), indent(), etc can work it | |||||
38 | 0 0 | 0 0 | %properties = %{ clone $p }; | |||
39 | 0 | 0 | delete $properties{filters}; # no need to rework filters | |||
40 | 0 | 0 | $code->($item, \%properties); | |||
41 | 26 | 10 | }; | |||
42 | 4 | 9 | }; | |||
43 | ||||||
44 | my $filters = sub { | |||||
45 | 4 | 14 | return $_filters_for{$id}; | |||
46 | 4 | 6 | }; | |||
47 | ||||||
48 | my $extras = sub { | |||||
49 | 4 | 8 | return $_extras_for{$id}; | |||
50 | 4 | 7 | }; | |||
51 | ||||||
52 | my $newline = sub { | |||||
53 | 0 0 | 0 0 | return ${$properties{_linebreak}} . (' ' x $properties{_current_indent}); | |||
54 | 4 | 3 | }; | |||
55 | ||||||
56 | my $indent = sub { | |||||
57 | 0 | 0 | $properties{_current_indent} += $properties{indent}; | |||
58 | 0 | 0 | $properties{_depth}++; | |||
59 | 0 | 0 | return; | |||
60 | 4 | 16 | }; | |||
61 | ||||||
62 | my $outdent = sub { | |||||
63 | 0 | 0 | $properties{_current_indent} -= $properties{indent}; | |||
64 | 0 | 0 | $properties{_depth}--; | |||
65 | 0 | 0 | return; | |||
66 | 4 | 3 | }; | |||
67 | ||||||
68 | my $imported = sub (\[@$%&];%) { | |||||
69 | 0 | 0 | my ($item, $p) = @_; | |||
70 | 0 | 0 | return Data::Printer::p( $item, %properties ); | |||
71 | 4 | 7 | }; | |||
72 | ||||||
73 | { | |||||
74 | 2 2 2 4 | 5 2 112 2 | no strict 'refs'; | |||
75 | 4 4 | 4 9 | *{"$caller\::filter"} = $filter; | |||
76 | 4 4 | 3 6 | *{"$caller\::indent"} = $indent; | |||
77 | 4 4 | 1 9 | *{"$caller\::outdent"} = $outdent; | |||
78 | 4 4 | 2 5 | *{"$caller\::newline"} = $newline; | |||
79 | ||||||
80 | 4 4 | 3 7 | *{"$caller\::p"} = $imported; | |||
81 | ||||||
82 | 4 4 | 1 6 | *{"$caller\::_filter_list"} = $filters; | |||
83 | 4 4 | 2 61 | *{"$caller\::_extra_options"} = $extras; | |||
84 | } | |||||
85 | }; | |||||
86 | ||||||
87 | ||||||
88 | 1; |