File Coverage

blib/lib/Routes/Tiny.pm
Criterion Covered Total %
statement 56 58 96.5
branch 10 12 83.3
condition 2 3 66.6
subroutine 10 10 100.0
pod 5 5 100.0
total 83 88 94.3


line stmt bran cond sub pod time code
1             package Routes::Tiny;
2              
3 17     17   254772 use strict;
  17         31  
  17         468  
4 17     17   62 use warnings;
  17         20  
  17         609  
5              
6             require Carp;
7             require Scalar::Util;
8 17     17   6206 use Routes::Tiny::Pattern;
  17         32  
  17         7457  
9              
10             our $VERSION = 0.19;
11              
12             sub new {
13 48     48 1 18344 my $class = shift;
14 48         90 my (%params) = @_;
15              
16 48         68 my $self = {};
17 48         74 bless $self, $class;
18              
19 48         145 $self->{strict_trailing_slash} = $params{strict_trailing_slash};
20 48         75 $self->{default_method} = $params{default_method};
21              
22 48         67 $self->{parent_pattern} = undef;
23 48         75 $self->{patterns} = [];
24 48         78 $self->{names} = {};
25             $self->{strict_trailing_slash} = 1
26 48 100       131 unless defined $self->{strict_trailing_slash};
27              
28 48         102 return $self;
29             }
30              
31             sub add_route {
32 66     66 1 267 my $self = shift;
33 66         118 my ($pattern, @args) = @_;
34              
35             $pattern = $self->_build_pattern(
36             strict_trailing_slash => $self->{strict_trailing_slash},
37             default_method => $self->{default_method},
38 66         170 routes => $self,
39             pattern => $pattern,
40             @args
41             );
42              
43 65         60 push @{$self->{patterns}}, $pattern;
  65         119  
44              
45 65 100       189 $self->_register_pattern_name($pattern) if $pattern->{name};
46              
47 65         104 return $pattern;
48             }
49              
50             sub mount {
51 12     12 1 36 my $self = shift;
52 12         15 my ($pattern, $routes, @args) = @_;
53              
54 12         18 $pattern = $self->add_route($pattern, subroutes => $routes, @args);
55 12         12 $routes->{parent_pattern} = $pattern;
56 12         6 $self->_register_pattern_name($_) for values %{ $routes->{names} };
  12         33  
57 12         24 Scalar::Util::weaken($routes->{parent_pattern});
58 12         23 return $pattern;
59             }
60              
61             sub match {
62 100     100 1 4070 my $self = shift;
63 100         169 my ($path, @args) = @_;
64              
65 100         89 foreach my $pattern (@{$self->{patterns}}) {
  100         206  
66 149 100       324 if (my $m = $pattern->match($path, @args)) {
67 80         220 return $m;
68             }
69             }
70              
71 20         58 return;
72             }
73              
74             sub build_path {
75 35     35 1 1704 my $self = shift;
76 35         86 my ($name, @args) = @_;
77              
78 35         56 my $pattern = $self->{names}->{$name};
79              
80 35 50       144 return $pattern->build_path(@args) if $pattern;
81              
82 0         0 Carp::croak("Unknown name '$name' used to build a path");
83             }
84              
85             sub _register_pattern_name {
86 48     48   50 my $self = shift;
87 48         47 my ($pattern) = @_;
88              
89 48         104 my $name = $pattern->name;
90 48 50       111 if (exists $self->{names}->{ $name }) {
91 0         0 Carp::carp("pattern name '$name' already used");
92             }
93             else {
94 48         75 $self->{names}->{ $name } = $pattern;
95 48   66     122 my $parent_routes = $self->{parent_pattern} && $self->{parent_pattern}->{routes};
96 48 100       104 if ($parent_routes) {
97 1         4 $parent_routes->_register_pattern_name(@_);
98             }
99             }
100             }
101              
102 66     66   66 sub _build_pattern { shift; return Routes::Tiny::Pattern->new(@_) }
  66         220  
103              
104             1;
105             __END__