File Coverage

blib/lib/Form/Tiny/Plugin/Filtered.pm
Criterion Covered Total %
statement 62 62 100.0
branch 2 2 100.0
condition 2 3 66.6
subroutine 22 22 100.0
pod 1 4 25.0
total 89 93 95.7


line stmt bran cond sub pod time code
1             package Form::Tiny::Plugin::Filtered;
2             $Form::Tiny::Plugin::Filtered::VERSION = '2.20';
3 9     9   907 use v5.10;
  9         29  
4 9     9   49 use strict;
  9         15  
  9         190  
5 9     9   56 use warnings;
  9         26  
  9         333  
6 9     9   84 use Types::Standard qw(ArrayRef InstanceOf Str);
  9         21  
  9         112  
7 9     9   24918 use Scalar::Util qw(blessed);
  9         22  
  9         450  
8 9     9   59 use Carp qw(carp);
  9         21  
  9         405  
9              
10 9     9   3335 use Form::Tiny::Hook;
  9         45  
  9         322  
11 9     9   4822 use Form::Tiny::Plugin::Filtered::Filter;
  9         28  
  9         324  
12 9     9   103 use Form::Tiny::Utils qw(trim);
  9         33  
  9         475  
13              
14 9     9   55 use parent 'Form::Tiny::Plugin';
  9         26  
  9         91  
15              
16             sub plugin
17             {
18 10     10 1 41 my ($self, $caller, $context) = @_;
19              
20             return {
21             subs => {
22             form_filter => sub {
23 4     4   88 $$context = undef;
24 4         26 $caller->form_meta->add_filter(@_);
25             },
26             field_filter => sub {
27 5     5   258 $caller->form_meta->add_field_filter($self->use_context($context), @_);
28             },
29             field_validator => sub {
30 1     1   16 $caller->form_meta->add_field_validator($self->use_context($context), @_);
31             },
32             form_trim_strings => sub {
33 4     4   294 $$context = undef;
34 4         30 $caller->form_meta->add_global_trim_filter;
35             },
36             },
37              
38 10         174 meta_roles => [__PACKAGE__],
39             };
40             }
41              
42 9     9   2179 use Moo::Role;
  9         20  
  9         122  
43              
44             requires qw(inherit_from setup);
45              
46             has 'filters' => (
47             is => 'ro',
48             writer => 'set_filters',
49             isa => ArrayRef [
50             InstanceOf ['Form::Tiny::Plugin::Filtered::Filter']
51             ],
52             default => sub { [] },
53             );
54              
55             sub _create_filter
56             {
57 17     17   46 my ($self, $filter, $code) = @_;
58              
59 17 100 66     132 return $filter
60             if defined blessed $filter && $filter->isa('Form::Tiny::Plugin::Filtered::Filter');
61              
62 15         444 return Form::Tiny::Plugin::Filtered::Filter->new(
63             type => $filter,
64             code => $code
65             );
66             }
67              
68             sub add_global_trim_filter
69             {
70 7     7 0 23 my ($self) = @_;
71              
72 7     23   29 return $self->add_filter(Str, sub { trim $_[1] });
  23         99  
73             }
74              
75             sub add_filter
76             {
77 12     12 0 94 my ($self, $filter, $code) = @_;
78              
79 12         24 push @{$self->filters}, $self->_create_filter($filter, $code);
  12         152  
80 12         15525 return $self;
81             }
82              
83             sub add_field_filter
84             {
85 5     5 0 14 my ($self, $field, $filter, $code) = @_;
86              
87 5         8 push @{$field->addons->{filters}}, $self->_create_filter($filter, $code);
  5         25  
88 5         2277 return $self;
89             }
90              
91             sub _apply_filters
92             {
93 32     32   82 my ($self, $obj, $def, $value) = @_;
94              
95 32         50 for my $filter (@{$self->filters}) {
  32         98  
96 40         140 $value = $filter->filter($obj, $value);
97             }
98              
99 32         3193 for my $filter (@{$def->addons->{filters}}) {
  32         122  
100 9         33 $value = $filter->filter($obj, $value);
101             }
102              
103 32         2271 return $value;
104             }
105              
106             after 'inherit_from' => sub {
107             my ($self, $parent) = @_;
108              
109             if ($parent->DOES('Form::Tiny::Plugin::Filtered')) {
110             $self->set_filters([@{$parent->filters}, @{$self->filters}]);
111             }
112             };
113              
114             after 'setup' => sub {
115             my ($self) = @_;
116              
117             $self->add_hook(
118             Form::Tiny::Hook->new(
119             hook => 'before_mangle',
120             code => sub { $self->_apply_filters(@_) },
121             inherited => 0,
122             )
123             );
124             };
125              
126             1;
127