File Coverage

blib/lib/Test/Base.pm
Criterion Covered Total %
statement 374 381 98.1
branch 152 192 79.1
condition 57 83 68.6
subroutine 64 64 100.0
pod 20 29 68.9
total 667 749 89.0


line stmt bran cond sub pod time code
1             package Test::Base;
2             our $VERSION = '0.88';
3              
4 104     104   768147 use Spiffy -Base;
  104         865372  
  104         1042  
5 104     104   721000 use Spiffy ':XXX';
  104     104   785  
  104     104   4081  
  104         858  
  104         214  
  104         3656  
  104         562  
  104         198  
  104         515  
6              
7             my $HAS_PROVIDER;
8             BEGIN {
9 104     104   66622 $HAS_PROVIDER = eval "require Test::Builder::Provider; 1";
10              
11 104 50       840 if ($HAS_PROVIDER) {
12 0         0 Test::Builder::Provider->import('provides');
13             }
14             else {
15 104     104   5543 *provides = sub { 1 };
  104         222  
16             }
17             }
18              
19              
20             my @test_more_exports;
21             BEGIN {
22 104     104   3461 @test_more_exports = qw(
23             ok isnt like unlike is_deeply cmp_ok
24             skip todo_skip pass fail
25             eq_array eq_hash eq_set
26             plan can_ok isa_ok diag
27             use_ok
28             $TODO
29             );
30             }
31              
32 104     104   164054 use Test::More import => \@test_more_exports;
  104         2701508  
  104         1343  
33 104     104   67232 use Carp;
  104         242  
  104         75261  
34              
35             our @EXPORT = (@test_more_exports, qw(
36             is no_diff
37              
38             blocks next_block first_block
39             delimiters spec_file spec_string
40             filters filters_delay filter_arguments
41             run run_compare run_is run_is_deeply run_like run_unlike
42             skip_all_unless_require is_deep run_is_deep
43             WWW XXX YYY ZZZ
44             tie_output no_diag_on_only
45              
46             find_my_self default_object
47              
48             croak carp cluck confess
49             ));
50              
51             field '_spec_file';
52             field '_spec_string';
53             field _filters => [qw(norm trim)];
54             field _filters_map => {};
55             field spec =>
56             -init => '$self->_spec_init';
57             field block_list =>
58             -init => '$self->_block_list_init';
59             field _next_list => [];
60             field block_delim =>
61             -init => '$self->block_delim_default';
62             field data_delim =>
63             -init => '$self->data_delim_default';
64             field _filters_delay => 0;
65             field _no_diag_on_only => 0;
66              
67             field block_delim_default => '===';
68             field data_delim_default => '---';
69              
70             my $default_class;
71             my $default_object;
72             my $reserved_section_names = {};
73              
74 374     374 1 581 sub default_object {
75 374   66     2339 $default_object ||= $default_class->new;
76 374         2036 return $default_object;
77             }
78              
79             my $import_called = 0;
80             sub import() {
81 112     112   248560 $import_called = 1;
82 112 100       15125 my $class = (grep /^-base$/i, @_)
83             ? scalar(caller)
84             : $_[0];
85 112 100       587 if (not defined $default_class) {
86 102         224 $default_class = $class;
87             }
88             # else {
89             # croak "Can't use $class after using $default_class"
90             # unless $default_class->isa($class);
91             # }
92              
93 112 100       842 unless (grep /^-base$/i, @_) {
94 104         238 my @args;
95 104         626 for (my $ii = 1; $ii <= $#_; ++$ii) {
96 112 50       346 if ($_[$ii] eq '-package') {
97 0         0 ++$ii;
98             } else {
99 112         438 push @args, $_[$ii];
100             }
101             }
102 104 100       2148 Test::More->import(import => \@test_more_exports, @args)
103             if @args;
104             }
105              
106 112         40880 _strict_warnings();
107 112         2656 goto &Spiffy::import;
108             }
109              
110             # Wrap Test::Builder::plan
111             my $plan_code = \&Test::Builder::plan;
112             my $Have_Plan = 0;
113             {
114 104     104   683 no warnings 'redefine';
  104         246  
  104         544948  
115             *Test::Builder::plan = sub {
116 85     85   7767 $Have_Plan = 1;
117 85         503 goto &$plan_code;
118             };
119             }
120              
121             my $DIED = 0;
122             $SIG{__DIE__} = sub { $DIED = 1; die @_ };
123              
124 168     168 0 1766 sub block_class { $self->find_class('Block') }
  168         586  
125 623     623 0 3670 sub filter_class { $self->find_class('Filter') }
  623         1312  
126              
127 791     791 0 1204 sub find_class {
128 791         1000 my $suffix = shift;
129 791         2016 my $class = ref($self) . "::$suffix";
130 791 100       4572 return $class if $class->can('new');
131 72         216 $class = __PACKAGE__ . "::$suffix";
132 72 100       697 return $class if $class->can('new');
133 64         5173 eval "require $class";
134 64 50       714 return $class if $class->can('new');
135 0         0 die "Can't find a class for $suffix";
136             }
137              
138 30     30 0 230 sub check_late {
139 30 100       115 if ($self->{block_list}) {
140 3         15 my $caller = (caller(1))[3];
141 3         14 $caller =~ s/.*:://;
142 3         468 croak "Too late to call $caller()"
143             }
144             }
145              
146             sub find_my_self() {
147 452 100   452 0 2842 my $self = ref($_[0]) eq $default_class
148             ? splice(@_, 0, 1)
149             : default_object();
150 452         1646 return $self, @_;
151             }
152              
153             sub blocks() {
154 72     72 1 14890 (my ($self), @_) = find_my_self(@_);
155              
156 72 100       692 croak "Invalid arguments passed to 'blocks'"
157             if @_ > 1;
158 71 50 66     359 croak sprintf("'%s' is invalid argument to blocks()", shift(@_))
159             if @_ && $_[0] !~ /^[a-zA-Z]\w*$/;
160              
161 71         2314 my $blocks = $self->block_list;
162              
163 57   100     610 my $section_name = shift || '';
164 10         26 my @blocks = $section_name
165 57 100       227 ? (grep { exists $_->{$section_name} } @$blocks)
166             : (@$blocks);
167              
168 57 100       316 return scalar(@blocks) unless wantarray;
169              
170 31 100       729 return (@blocks) if $self->_filters_delay;
171              
172 29         303 for my $block (@blocks) {
173 58 100       1479 $block->run_filters
174             unless $block->is_filtered;
175             }
176              
177 29         328 return (@blocks);
178             }
179              
180             sub next_block() {
181 53     53 1 2755 (my ($self), @_) = find_my_self(@_);
182 53         1528 my $list = $self->_next_list;
183 53 100       523 if (@$list == 0) {
184 29         62 $list = [@{$self->block_list}, undef];
  29         905  
185 29         800 $self->_next_list($list);
186             }
187 53         291 my $block = shift @$list;
188 53 100 100     1692 if (defined $block and not $block->is_filtered) {
189 39         404 $block->run_filters;
190             }
191 53         579 return $block;
192             }
193              
194             sub first_block() {
195 17     17 1 3535 (my ($self), @_) = find_my_self(@_);
196 17         641 $self->_next_list([]);
197 17         234 $self->next_block;
198             }
199              
200             sub filters_delay() {
201 2     2 1 15 (my ($self), @_) = find_my_self(@_);
202 2 50       66 $self->_filters_delay(defined $_[0] ? shift : 1);
203             }
204              
205             sub no_diag_on_only() {
206 3     3 0 33 (my ($self), @_) = find_my_self(@_);
207 3 50       119 $self->_no_diag_on_only(defined $_[0] ? shift : 1);
208             }
209              
210             sub delimiters() {
211 5     5 1 379 (my ($self), @_) = find_my_self(@_);
212 5         31 $self->check_late;
213 4         11 my ($block_delimiter, $data_delimiter) = @_;
214 4   33     18 $block_delimiter ||= $self->block_delim_default;
215 4   33     17 $data_delimiter ||= $self->data_delim_default;
216 4         145 $self->block_delim($block_delimiter);
217 4         141 $self->data_delim($data_delimiter);
218 4         113 return $self;
219             }
220              
221             sub spec_file() {
222 4     4 1 476 (my ($self), @_) = find_my_self(@_);
223 4         20 $self->check_late;
224 3         81 $self->_spec_file(shift);
225 3         31 return $self;
226             }
227              
228             sub spec_string() {
229 21     21 1 14799 (my ($self), @_) = find_my_self(@_);
230 21         58 $self->check_late;
231 20         914 $self->_spec_string(shift);
232 20         352 return $self;
233             }
234              
235             sub filters() {
236 23     23 1 2446 (my ($self), @_) = find_my_self(@_);
237 23 100       117 if (ref($_[0]) eq 'HASH') {
238 7         288 $self->_filters_map(shift);
239             }
240             else {
241 16         2719 my $filters = $self->_filters;
242 16         380 push @$filters, @_;
243             }
244 23         172 return $self;
245             }
246              
247             sub filter_arguments() {
248 2     2 1 12 $Test::Base::Filter::arguments;
249             }
250              
251 1     1 0 16 sub have_text_diff {
252 1 50 33     2 eval { require Text::Diff; 1 } &&
  1         900  
  1         9271  
253             $Text::Diff::VERSION >= 0.35 &&
254             $Algorithm::Diff::VERSION >= 1.15;
255             }
256              
257             provides 'is';
258             sub is($$;$) {
259 190     190 1 60406 (my ($self), @_) = find_my_self(@_);
260 190         463 my ($actual, $expected, $name) = @_;
261 190 50       666 local $Test::Builder::Level = $Test::Builder::Level + 1 unless $HAS_PROVIDER;
262 190 50 100     2754 if ($ENV{TEST_SHOW_NO_DIFFS} or
      66        
      66        
      33        
      33        
263             not defined $actual or
264             not defined $expected or
265             $actual eq $expected or
266             not($self->have_text_diff) or
267             $expected !~ /\n./s
268             ) {
269 190         787 Test::More::is($actual, $expected, $name);
270             }
271             else {
272 0 0       0 $name = '' unless defined $name;
273 0         0 ok $actual eq $expected, $name;
274 0         0 diag Text::Diff::diff(\$expected, \$actual);
275             }
276             }
277              
278             sub run(&;$) {
279 20     20 1 195250 (my ($self), @_) = find_my_self(@_);
280 20         47 my $callback = shift;
281 20         54 for my $block (@{$self->block_list}) {
  20         697  
282 41 100       8495 $block->run_filters unless $block->is_filtered;
283 40         286 &{$callback}($block);
  40         145  
284             }
285             }
286              
287             my $name_error = "Can't determine section names";
288 35     35   75 sub _section_names {
289 35 100       174 return @_ if @_ == 2;
290 8 50       38 my $block = $self->first_block
291             or croak $name_error;
292 17         83 my @names = grep {
293 8 50       100 $_ !~ /^(ONLY|LAST|SKIP)$/;
294 8         19 } @{$block->{_section_order}[0] || []};
295 8 50       48 croak "$name_error. Need two sections in first block"
296             unless @names == 2;
297 8         44 return @names;
298             }
299              
300 35     35   80 sub _assert_plan {
301 35 100       154 plan('no_plan') unless $Have_Plan;
302             }
303              
304 104     104   91962 sub END {
305 104 50 100     1289 run_compare() unless $Have_Plan or $DIED or not $import_called;
      66        
306             }
307              
308             sub run_compare() {
309 1     1 1 16 (my ($self), @_) = find_my_self(@_);
310 1         5 $self->_assert_plan;
311 1         6 my ($x, $y) = $self->_section_names(@_);
312 1         4 local $Test::Builder::Level = $Test::Builder::Level + 1;
313 1         2 for my $block (@{$self->block_list}) {
  1         62  
314 3 50 33     1550 next unless exists($block->{$x}) and exists($block->{$y});
315 3 50       66 $block->run_filters unless $block->is_filtered;
316 3 100       26 if (ref $block->$x) {
    100          
317 1 50       5 is_deeply($block->$x, $block->$y,
318             $block->name ? $block->name : ());
319             }
320             elsif (ref $block->$y eq 'Regexp') {
321 1 50       6 my $regexp = ref $y ? $y : $block->$y;
322 1 50       3 like($block->$x, $regexp, $block->name ? $block->name : ());
323             }
324             else {
325 1 50       7 is($block->$x, $block->$y, $block->name ? $block->name : ());
326             }
327             }
328             }
329              
330             sub run_is() {
331 23     23 1 2700 (my ($self), @_) = find_my_self(@_);
332 23         153 $self->_assert_plan;
333 23         126 my ($x, $y) = $self->_section_names(@_);
334 23         403 local $Test::Builder::Level = $Test::Builder::Level + 1;
335 23         44 for my $block (@{$self->block_list}) {
  23         705  
336 48 100 100     19795 next unless exists($block->{$x}) and exists($block->{$y});
337 36 100       974 $block->run_filters unless $block->is_filtered;
338 36 100       380 is($block->$x, $block->$y,
339             $block->name ? $block->name : ()
340             );
341             }
342             }
343              
344             sub run_is_deeply() {
345 4     4 1 879 (my ($self), @_) = find_my_self(@_);
346 4         32 $self->_assert_plan;
347 4         20 my ($x, $y) = $self->_section_names(@_);
348 4         9 for my $block (@{$self->block_list}) {
  4         123  
349 8 100 66     2600 next unless exists($block->{$x}) and exists($block->{$y});
350 6 100       164 $block->run_filters unless $block->is_filtered;
351 6 100       62 is_deeply($block->$x, $block->$y,
352             $block->name ? $block->name : ()
353             );
354             }
355             }
356              
357             sub run_like() {
358 5     5 1 813 (my ($self), @_) = find_my_self(@_);
359 5         22 $self->_assert_plan;
360 5         36 my ($x, $y) = $self->_section_names(@_);
361 5         12 for my $block (@{$self->block_list}) {
  5         144  
362 7 100 66     336 next unless exists($block->{$x}) and defined($y);
363 6 100       142 $block->run_filters unless $block->is_filtered;
364 6 100       56 my $regexp = ref $y ? $y : $block->$y;
365 6 100       29 like($block->$x, $regexp,
366             $block->name ? $block->name : ()
367             );
368             }
369             }
370              
371             sub run_unlike() {
372 1     1 1 10 (my ($self), @_) = find_my_self(@_);
373 1         5 $self->_assert_plan;
374 1         3 my ($x, $y) = $self->_section_names(@_);
375 1         2 for my $block (@{$self->block_list}) {
  1         34  
376 1 50 33     8 next unless exists($block->{$x}) and defined($y);
377 1 50       25 $block->run_filters unless $block->is_filtered;
378 1 50       11 my $regexp = ref $y ? $y : $block->$y;
379 1 50       4 unlike($block->$x, $regexp,
380             $block->name ? $block->name : ()
381             );
382             }
383             }
384              
385             sub skip_all_unless_require() {
386 3     3 0 174 (my ($self), @_) = find_my_self(@_);
387 3         6 my $module = shift;
388 3 50       155 eval "require $module; 1"
389             or Test::More::plan(
390             skip_all => "$module failed to load"
391             );
392             }
393              
394             sub is_deep() {
395 2     2 1 613 (my ($self), @_) = find_my_self(@_);
396 2         19 require Test::Deep;
397 2         12 Test::Deep::cmp_deeply(@_);
398             }
399              
400             sub run_is_deep() {
401 1     1 0 8 (my ($self), @_) = find_my_self(@_);
402 1         6 $self->_assert_plan;
403 1         5 my ($x, $y) = $self->_section_names(@_);
404 1         3 for my $block (@{$self->block_list}) {
  1         27  
405 1 50 33     21 next unless exists($block->{$x}) and exists($block->{$y});
406 1 50       29 $block->run_filters unless $block->is_filtered;
407 1 50       11 is_deep($block->$x, $block->$y,
408             $block->name ? $block->name : ()
409             );
410             }
411             }
412              
413 87     87   363 sub _pre_eval {
414 87         191 my $spec = shift;
415 87 100       737 return $spec unless $spec =~
416             s/\A\s*<<<(.*?)>>>\s*$//sm;
417 1         4 my $eval_code = $1;
418 1         97 eval "package main; $eval_code";
419 1 50       9 croak $@ if $@;
420 1         3 return $spec;
421             }
422              
423 87     87   1516 sub _block_list_init {
424 87         2146 my $spec = $self->spec;
425 87         1179 $spec = $self->_pre_eval($spec);
426 87         2657 my $cd = $self->block_delim;
427 87         8553 my @hunks = ($spec =~ /^(\Q${cd}\E.*?(?=^\Q${cd}\E|\z))/msg);
428 87         629 my $blocks = $self->_choose_blocks(@hunks);
429 73         2153 $self->block_list($blocks); # Need to set early for possible filter use
430 73         952 my $seq = 1;
431 73         259 for my $block (@$blocks) {
432 146         3723 $block->blocks_object($self);
433 146         3825 $block->seq_num($seq++);
434             }
435 73         886 return $blocks;
436             }
437              
438 87     87   221 sub _choose_blocks {
439 87         231 my $blocks = [];
440 87         465 for my $hunk (@_) {
441 166         751 my $block = $self->_make_block($hunk);
442 152 100       519 if (exists $block->{ONLY}) {
443 3 50       75 diag "I found ONLY: maybe you're debugging?"
444             unless $self->_no_diag_on_only;
445 3         46 return [$block];
446             }
447 149 100       829 next if exists $block->{SKIP};
448 145         657 push @$blocks, $block;
449 145 100       611 if (exists $block->{LAST}) {
450 2         6 return $blocks;
451             }
452             }
453 68         197 return $blocks;
454             }
455              
456 254     254   371 sub _check_reserved {
457 254         411 my $id = shift;
458 254 100 66     4218 croak "'$id' is a reserved name. Use something else.\n"
459             if $reserved_section_names->{$id} or
460             $id =~ /^_/;
461             }
462              
463 166     166   350 sub _make_block {
464 166         814 my $hunk = shift;
465 166         4943 my $cd = $self->block_delim;
466 166         7023 my $dd = $self->data_delim;
467 166         4051 my $block = $self->block_class->new;
468 166 50       12878 $hunk =~ s/\A\Q${cd}\E[ \t]*(.*)\s+// or die;
469 166         534 my $name = $1;
470 166         3338 my @parts = split /^\Q${dd}\E +\(?(\w+)\)? *(.*)?\n/m, $hunk;
471 166         427 my $description = shift @parts;
472 166   100     918 $description ||= '';
473 166 100       675 unless ($description =~ /\S/) {
474 163         313 $description = $name;
475             }
476 166         882 $description =~ s/\s*\z//;
477 166         605 $block->set_value(description => $description);
478              
479 166         1291 my $section_map = {};
480 166         352 my $section_order = [];
481 166         725 while (@parts) {
482 254         786 my ($type, $filters, $value) = splice(@parts, 0, 3);
483 254         768 $self->_check_reserved($type);
484 241 100       634 $value = '' unless defined $value;
485 241 100       595 $filters = '' unless defined $filters;
486 241 100       1076 if ($filters =~ /:(\s|\z)/) {
487 34 100       324 croak "Extra lines not allowed in '$type' section"
488             if $value =~ /\S/;
489 33         167 ($filters, $value) = split /\s*:(?:\s+|\z)/, $filters, 2;
490 33 50       144 $value = '' unless defined $value;
491 33         223 $value =~ s/^\s*(.*?)\s*$/$1/;
492             }
493 240         1084 $section_map->{$type} = {
494             filters => $filters,
495             };
496 240         644 push @$section_order, $type;
497 240         591 $block->set_value($type, $value);
498             }
499 152         644 $block->set_value(name => $name);
500 152         561 $block->set_value(_section_map => $section_map);
501 152         685 $block->set_value(_section_order => $section_order);
502 152         563 return $block;
503             }
504              
505 87     87   838 sub _spec_init {
506 87 100       2507 return $self->_spec_string
507             if $self->_spec_string;
508 67         710 local $/;
509 67         263 my $spec;
510 67 100       1712 if (my $spec_file = $self->_spec_file) {
511 3 50       150 open FILE, $spec_file or die $!;
512 3         2202 $spec = ;
513 3         40 close FILE;
514             }
515             else {
516 64         537 $spec = do {
517             package main;
518 104     104   1186 no warnings 'once';
  104         1899  
  104         76046  
519 64         2093 ;
520             };
521             }
522 67         1292 return $spec;
523             }
524              
525             sub _strict_warnings() {
526 112     112   1865 require Filter::Util::Call;
527 112         262 my $done = 0;
528             Filter::Util::Call::filter_add(
529             sub {
530 136 100   136   234410 return 0 if $done;
531 111         286 my ($data, $end) = ('', '');
532 111         1507 while (my $status = Filter::Util::Call::filter_read()) {
533 1385 50       3128 return $status if $status < 0;
534 1385 100       2957 if (/^__(?:END|DATA)__\r?$/) {
535 86         194 $end = $_;
536 86         206 last;
537             }
538 1299         1746 $data .= $_;
539 1299         5861 $_ = '';
540             }
541 111         475 $_ = "use strict;use warnings;$data$end";
542 111         3468 $done = 1;
543             }
544 112         1020 );
545             }
546              
547             sub tie_output() {
548 8     8 1 33 my $handle = shift;
549 8 50       26 die "No buffer to tie" unless @_;
550 8         50 tie *$handle, 'Test::Base::Handle', $_[0];
551             }
552              
553 2     2 1 14 sub no_diff {
554 2         24 $ENV{TEST_SHOW_NO_DIFFS} = 1;
555             }
556              
557             package Test::Base::Handle;
558              
559             sub TIEHANDLE() {
560 8     8   15 my $class = shift;
561 8         44 bless \ $_[0], $class;
562             }
563              
564 12     12   2228 sub PRINT {
565 12         267 $$self .= $_ for @_;
566             }
567              
568             #===============================================================================
569             # Test::Base::Block
570             #
571             # This is the default class for accessing a Test::Base block object.
572             #===============================================================================
573             package Test::Base::Block;
574             our @ISA = qw(Spiffy);
575              
576             our @EXPORT = qw(block_accessor);
577              
578 2     2   1448 sub AUTOLOAD {
579 2         9 return;
580             }
581              
582             sub block_accessor() {
583 489     489   930 my $accessor = shift;
584 104     104   1237 no strict 'refs';
  104         197  
  104         24272  
585 489 50       2546 return if defined &$accessor;
586             *$accessor = sub {
587 887     887   12632 my $self = shift;
588 887 50       8302 if (@_) {
589 0         0 Carp::croak "Not allowed to set values for '$accessor'";
590             }
591 887 100       951 my @list = @{$self->{$accessor} || []};
  887         3583  
592             return wantarray
593 887 100       3694 ? (@list)
594             : $list[0];
595 489         4422 };
596             }
597              
598             block_accessor 'name';
599             block_accessor 'description';
600             Spiffy::field 'seq_num';
601             Spiffy::field 'is_filtered';
602             Spiffy::field 'blocks_object';
603             Spiffy::field 'original_values' => {};
604              
605 1519     1519   2266 sub set_value {
606 104     104   683 no strict 'refs';
  104         200  
  104         24886  
607 1519         1955 my $accessor = shift;
608 1519 100       5392 block_accessor $accessor
609             unless defined &$accessor;
610 1519         7573 $self->{$accessor} = [@_];
611             }
612              
613 142     142   1623 sub run_filters {
614 142         390 my $map = $self->_section_map;
615 142         407 my $order = $self->_section_order;
616 142 50       3399 Carp::croak "Attempt to filter a block twice"
617             if $self->is_filtered;
618 142         1073 for my $type (@$order) {
619 222         659 my $filters = $map->{$type}{filters};
620 222         785 my @value = $self->$type;
621 222         5702 $self->original_values->{$type} = $value[0];
622 222         2635 for my $filter ($self->_get_filters($type, $filters)) {
623 660 100       1843 $Test::Base::Filter::arguments =
624             $filter =~ s/=(.*)$// ? $1 : undef;
625 660         1136 my $function = "main::$filter";
626 104     104   984 no strict 'refs';
  104         191  
  104         84199  
627 660 100       6718 if (defined &$function) {
628 39 100 100     356 local $_ =
629             (@value == 1 and not defined($value[0])) ? undef :
630             join '', @value;
631 39         76 my $old = $_;
632 39         175 @value = &$function(@value);
633 39 100 66     6671 if (not(@value) or
      100        
      66        
634             @value == 1 and defined($value[0]) and $value[0] =~ /\A(\d+|)\z/
635             ) {
636 19 100 100     71 if ($value[0] && $_ eq $old) {
637 1         7 Test::Base::diag("Filters returning numbers are supposed to do munging \$_: your filter '$function' apparently doesn't.");
638             }
639 19         223 @value = ($_);
640             }
641             }
642             else {
643 621         44779 my $filter_object = $self->blocks_object->filter_class->new;
644 621 100       15267 die "Can't find a function or method for '$filter' filter\n"
645             unless $filter_object->can($filter);
646 620         19134 $filter_object->current_block($self);
647 620         5803 @value = $filter_object->$filter(@value);
648             }
649             # Set the value after each filter since other filters may be
650             # introspecting.
651 657         5570 $self->set_value($type, @value);
652             }
653             }
654 139         3382 $self->is_filtered(1);
655             }
656              
657 222     222   420 sub _get_filters {
658 222         398 my $type = shift;
659 222   100     974 my $string = shift || '';
660 222         6932 $string =~ s/\s*(.*?)\s*/$1/;
661 222         572 my @filters = ();
662 222   100     13349 my $map_filters = $self->blocks_object->_filters_map->{$type} || [];
663 222 100       9003 $map_filters = [ $map_filters ] unless ref $map_filters;
664 222         422 my @append = ();
665 222         351 for (
666 222         4924 @{$self->blocks_object->_filters},
667             @$map_filters,
668             split(/\s+/, $string),
669             ) {
670 665         8035 my $filter = $_;
671 665 50       1507 last unless length $filter;
672 665 100       2063 if ($filter =~ s/^-//) {
    100          
673 2         5 @filters = grep { $_ ne $filter } @filters;
  8         19  
674             }
675             elsif ($filter =~ s/^\+//) {
676 2         6 push @append, $filter;
677             }
678             else {
679 661         1532 push @filters, $filter;
680             }
681             }
682 222         999 return @filters, @append;
683             }
684              
685             {
686             %$reserved_section_names = map {
687             ($_, 1);
688             } keys(%Test::Base::Block::), qw( new DESTROY );
689             }
690              
691             1;