File Coverage

blib/lib/Path/Dispatcher/Rule.pm
Criterion Covered Total %
statement 37 38 97.3
branch 12 12 100.0
condition n/a
subroutine 10 11 90.9
pod 3 5 60.0
total 62 66 93.9


line stmt bran cond sub pod time code
1             package Path::Dispatcher::Rule;
2             # ABSTRACT: predicate and codeblock
3              
4             our $VERSION = '1.07';
5              
6 32     32   769 use Moo;
  32         70  
  32         175  
7              
8 32     32   28601 use Types::Standard qw(Bool);
  32         2382556  
  32         315  
9 32     32   42265 use Path::Dispatcher::Match;
  32         146  
  32         1816  
10              
11 32     32   271 use constant match_class => "Path::Dispatcher::Match";
  32         403  
  32         16879  
12              
13             has payload => (
14             is => 'ro',
15             predicate => 'has_payload',
16             );
17              
18             has prefix => (
19             is => 'ro',
20             isa => Bool,
21             default => 0,
22             );
23              
24             # support for deprecated "block" attribute
25 1     1 1 16 sub block { shift->payload(@_) }
26 1     1 0 352 sub has_block { shift->has_payload(@_) }
27             around BUILDARGS => sub {
28             my $orig = shift;
29             my $self = shift;
30              
31             my $args = $self->$orig(@_);
32             $args->{payload} ||= delete $args->{block}
33             if exists $args->{block};
34              
35             return $args;
36             };
37              
38             sub match {
39 381     381 1 8864 my $self = shift;
40 381         594 my $path = shift;
41 381         674 my %args = @_;
42              
43 381         546 my $result;
44              
45 381 100       1307 if ($self->prefix) {
46 42         119 $result = $self->_prefix_match($path);
47             }
48             else {
49 339         991 $result = $self->_match($path);
50             }
51              
52 381 100       1117 return if !$result;
53              
54 241 100       635 if (ref($result) ne 'HASH') {
55 1         22 die "Results returned from _match must be a hashref";
56             }
57              
58             my $match = $self->match_class->new(
59             path => $path,
60             rule => $self,
61 240 100       712 %{ $args{extra_constructor_args} || {} },
  240         5153  
62             %$result,
63             );
64              
65 240         93600 return $match;
66             }
67              
68             sub complete {
69 0     0 0 0 return (); # no completions
70             }
71              
72             sub _prefix_match {
73 42     42   72 my $self = shift;
74 42         127 return $self->_match(@_);
75             }
76              
77             sub run {
78 71     71 1 2132 my $self = shift;
79              
80 71         559 my $payload = $self->payload;
81              
82 71 100       433 die "No codeblock to run" if !$payload;
83 69 100       417 die "Payload is not a coderef" if ref($payload) ne 'CODE';
84              
85 67         406 $self->payload->(@_);
86             }
87              
88             __PACKAGE__->meta->make_immutable;
89 32     32   299 no Moo;
  32         79  
  32         192  
90              
91             1;
92              
93             __END__