File Coverage

blib/lib/Map/Metro/Graph/Station.pm
Criterion Covered Total %
statement 183 234 78.2
branch 31 104 29.8
condition 2 6 33.3
subroutine 29 34 85.2
pod n/a
total 245 378 64.8


line stmt bran cond sub pod time code
1 1     1   5 use Map::Metro::Standard::Moops;
  1         2  
  1         11  
2 1     1   2331 use strict;
  1         2  
  1         27  
3 1     1   7 use warnings;
  1         2  
  1         79  
4              
5             our $VERSION = '0.2300'; # VERSION
6             # PODNAME: Map::Metro::Graph::Station
7             # ABSTRACT: Information about a station
8              
9 1     1   1830 class Map::Metro::Graph::Station {
  1     1   46  
  1     1   9  
  1         2  
  1         73  
  1         7  
  1         3  
  1         9  
  1         281  
  1         2  
  1         9  
  1         64  
  1         2  
  1         52  
  1         5  
  1         3  
  1         101  
  1         36  
  1         7  
  1         2  
  1         9  
  1         4718  
  1         3  
  1         9  
  1         6646  
  1         2  
  1         12  
  1         4577  
  1         2  
  1         13  
  1         80  
  1         2  
  1         9  
  1         230  
  1         2  
  1         8  
  1         1307  
  1         2  
  1         10  
  1         6341  
  1         4  
  1         6  
  1         2  
  1         29  
  1         6  
  1         3  
  1         57  
  1         4  
  1         3  
  1         375  
  1         10  
  1         5589  
  1         22  
  1         169  
  0         0  
10              
11 1     1   15982 use Text::Undiacritic 'undiacritic';
  1         333277  
  1         583  
12              
13 1         17 has id => (
14             is => 'ro',
15             isa => Int,
16             required => 1,
17             documentation => 'Internal identification',
18             );
19              
20 1         4842 has name => (
21             is => 'rw',
22             isa => Str,
23             required => 1,
24             documentation => q{The station's name, with any diacritics removed.},
25             );
26 1         4903 has original_name => (
27             is => 'ro',
28             isa => Maybe[Str],
29             documentation => q{The station's name as given in the map file.},
30             );
31             has search_names => (
32             is => 'rw',
33             isa => ArrayRef[Str],
34             traits => ['Array'],
35 16         570 default => sub { [] },
36 1         4817 handles => {
37             add_search_name => 'push',
38             all_search_names => 'elements',
39             },
40             documentation => q{All search names for the station given in the map file.},
41             );
42             has alternative_names => (
43             is => 'rw',
44             isa => ArrayRef[Str],
45             traits => ['Array'],
46 20         702 default => sub { [] },
47 1         11530 handles => {
48             add_alternative_name => 'push',
49             all_alternative_names => 'elements',
50             },
51             documentation => q{All alternative names for the station given in the map file.},
52             );
53              
54             has lines => (
55             is => 'rw',
56             isa => ArrayRef[ Line ],
57             traits => ['Array'],
58 20         712 default => sub { [] },
59 1         11145 init_arg => undef,
60             handles => {
61             add_line => 'push',
62             all_lines => 'elements',
63             find_line => 'first',
64             filter_lines => 'grep',
65             },
66             documentation => q{All lines passing through this station.},
67             );
68             has connecting_stations => (
69             is => 'ro',
70             isa => ArrayRef[ Station ],
71             traits => ['Array'],
72 20         707 default => sub { [] },
73 1         16185 init_arg => undef,
74             handles => {
75             add_connecting_station => 'push',
76             all_connecting_stations => 'elements',
77             find_connecting_station => 'first',
78             },
79             documentation => q{All stations one can travel to from this station without passing another station.},
80             );
81 1         14079 has do_undiacritic => (
82             is => 'rw',
83             isa => Bool,
84             default => 1,
85             documentation_alts => {
86             0 => q{Do not remove diacritics from station name.},
87             1 => q{Do remove diacritics from station name.},
88             },
89             );
90              
91 1 50 33 1   4604 around BUILDARGS($orig: $class, %args) {
  1 50   1   2  
  1 50   1   193  
  1 50   20   6  
  1 50       2  
  1         173  
  1         6  
  1         2  
  1         358  
  1         5820  
  20         275  
  20         55  
  20         46  
  20         50  
  20         35  
  20         25  
  20         151  
  0         0  
  20         43  
  20         92  
  20         142  
  20         48  
92 20 50 33     105 return $class->$orig(%args) if exists $args{'do_undiacritic'} && !$args{'do_undiacritic'};
93              
94 20         52 my $no_diacritic = undiacriticise($args{'name'});
95 20 100       47 if(defined $no_diacritic) {
96 4 50       15 if(exists $args{'search_names'}) {
97 0         0 push @{ $args{'search_names'} } => $no_diacritic;
  0         0  
98             }
99             else {
100 4         13 $args{'search_names'} = [$no_diacritic];
101             }
102             }
103 20         91 return $class->$orig(%args);
104             }
105              
106 1 0   1   2408 method set_name(Str $name) {
  1 0   1   3  
  1 0   0   193  
  1 0       8  
  1 0       2  
  1         217  
  1         1023  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
107 0 0       0 if($self->do_undiacritic) {
108 0         0 my $no_diacritic = undiacriticise($name);
109 0 0       0 if(defined $no_diacritic) {
110 0         0 $self->add_search_name($no_diacritic);
111             }
112             }
113 0         0 $self->name($name);
114             }
115 1 0   1   2175 method set_original_name(Str $name) {
  1 0   1   3  
  1 0   0   187  
  1 0       7  
  1 0       2  
  1         198  
  1         180  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
116 0 0       0 if($self->do_undiacritic) {
117 0         0 my $no_diacritic = undiacriticise($name);
118              
119 0 0       0 if(defined $no_diacritic) {
120 0         0 $self->add_search_name($no_diacritic);
121             }
122             }
123 0         0 $self->original_name($name);
124             }
125 1 0   1   2249 around add_search_name(@names) {
  1 0   0   2  
  1 0       330  
  1         159  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
126 0 0       0 if($self->do_undiacritic) {
127 0         0 foreach my $name (@names) {
128 0         0 my $no_diacritic = undiacriticise($name);
129 0 0       0 push @names => $no_diacritic if defined $no_diacritic;
130             }
131             }
132 0         0 $self->$next(@names);
133             }
134 1 0   1   2229 around add_alternative_name(@names) {
  1 0   0   3  
  1 0       307  
  1         818  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
135 0 0       0 if($self->do_undiacritic) {
136 0         0 foreach my $name (@names) {
137 0         0 my $no_diacritic = undiacriticise($name);
138 0 0       0 push @names => $no_diacritic if defined $no_diacritic;
139             }
140             }
141 0         0 $self->$next(@names);
142             }
143 1 50   1   2640 around add_line(Line $line) {
  1 50   1   3  
  1 50   48   216  
  1 50       6  
  1 50       1  
  1 50       162  
  1         787  
  48         791  
  48         108  
  48         103  
  48         107  
  48         100  
  48         107  
  48         47  
  48         142  
  48         54  
144 48 100   33   1979 $self->$next($line) if !$self->find_line(sub { $line->id eq $_->id });
  33         1188  
145             }
146              
147 1 50   1   2680 around add_connecting_station(Station $station) {
  1 50   1   2  
  1 50   48   224  
  1 50       5  
  1 50       2  
  1 50       161  
  1         776  
  48         1627  
  48         125  
  48         87  
  48         101  
  48         96  
  48         100  
  48         46  
  48         128  
  48         53  
148 48 100   34   2256 $self->$next($station) if !$self->find_connecting_station(sub { $station->id eq $_->id });
  34         1273  
149             }
150 1 50   1   1975 fun undiacriticise(Str $text) {
  1 50   1   2  
  1 50   20   147  
  1 50       18  
  1         3  
  1         134  
  1         752  
  20         47  
  20         59  
  20         51  
  20         24  
  20         57  
  20         25  
151 20         68 my $undia = undiacritic($text);
152 20 100       1402 return $undia if $undia ne $text;
153 16         33 return;
154             }
155              
156 1 0   1   1255 method name_with_alternative {
  1     0   2  
  1         108  
  1         168  
  0            
  0            
157 0           return ($self->name, $self->all_alternative_names);
158             }
159             }
160              
161             1;
162              
163             __END__
164              
165             =pod
166              
167             =encoding UTF-8
168              
169             =head1 NAME
170              
171             Map::Metro::Graph::Station - Information about a station
172              
173             =head1 VERSION
174              
175             Version 0.2300, released 2016-01-14.
176              
177              
178              
179             =head1 DESCRIPTION
180              
181             Stations represents actual stations, and are used both during the graph building phase and the navigational phase.
182              
183             =head1 ATTRIBUTES
184              
185              
186             =head2 id
187              
188             =begin HTML
189              
190             <table cellpadding="0" cellspacing="0">
191             <tr>
192             <td style="padding-right: 6px; padding-left: 6px; border-right: 1px solid #b8b8b8; white-space: nowrap;"><a href="https://metacpan.org/pod/Types::Standard#Int">Int</a></td>
193             <td style="padding-right: 6px; padding-left: 6px; border-right: 1px solid #b8b8b8; white-space: nowrap;">required</td>
194             <td style="padding-left: 6px; padding-right: 6px; white-space: nowrap;">read-only</td>
195             </tr>
196             </table>
197              
198             <p>Internal identification</p>
199              
200             =end HTML
201              
202             =begin markdown
203              
204             <table cellpadding="0" cellspacing="0">
205             <tr>
206             <td style="padding-right: 6px; padding-left: 6px; border-right: 1px solid #b8b8b8; white-space: nowrap;"><a href="https://metacpan.org/pod/Types::Standard#Int">Int</a></td>
207             <td style="padding-right: 6px; padding-left: 6px; border-right: 1px solid #b8b8b8; white-space: nowrap;">required</td>
208             <td style="padding-left: 6px; padding-right: 6px; white-space: nowrap;">read-only</td>
209             </tr>
210             </table>
211              
212             <p>Internal identification</p>
213              
214             =end markdown
215              
216             =head2 name
217              
218             =begin HTML
219              
220             <table cellpadding="0" cellspacing="0">
221             <tr>
222             <td style="padding-right: 6px; padding-left: 6px; border-right: 1px solid #b8b8b8; white-space: nowrap;"><a href="https://metacpan.org/pod/Types::Standard#Str">Str</a></td>
223             <td style="padding-right: 6px; padding-left: 6px; border-right: 1px solid #b8b8b8; white-space: nowrap;">required</td>
224             <td style="padding-left: 6px; padding-right: 6px; white-space: nowrap;">read/write</td>
225             </tr>
226             </table>
227              
228             <p>The station's name, with any diacritics removed.</p>
229              
230             =end HTML
231              
232             =begin markdown
233              
234             <table cellpadding="0" cellspacing="0">
235             <tr>
236             <td style="padding-right: 6px; padding-left: 6px; border-right: 1px solid #b8b8b8; white-space: nowrap;"><a href="https://metacpan.org/pod/Types::Standard#Str">Str</a></td>
237             <td style="padding-right: 6px; padding-left: 6px; border-right: 1px solid #b8b8b8; white-space: nowrap;">required</td>
238             <td style="padding-left: 6px; padding-right: 6px; white-space: nowrap;">read/write</td>
239             </tr>
240             </table>
241              
242             <p>The station's name, with any diacritics removed.</p>
243              
244             =end markdown
245              
246             =head2 alternative_names
247              
248             =begin HTML
249              
250             <table cellpadding="0" cellspacing="0">
251             <tr>
252             <td style="padding-right: 6px; padding-left: 6px; border-right: 1px solid #b8b8b8; white-space: nowrap;"><a href="https://metacpan.org/pod/Types::Standard#ArrayRef">ArrayRef</a> [ <a href="https://metacpan.org/pod/Types::Standard#Str">Str</a> ]</td>
253             <td style="padding-right: 6px; padding-left: 6px; border-right: 1px solid #b8b8b8; white-space: nowrap;">optional, default is a <code>coderef</code></td>
254             <td style="padding-left: 6px; padding-right: 6px; white-space: nowrap;">read/write</td>
255             </tr>
256             </table>
257              
258             <p>All alternative names for the station given in the map file.</p>
259              
260             =end HTML
261              
262             =begin markdown
263              
264             <table cellpadding="0" cellspacing="0">
265             <tr>
266             <td style="padding-right: 6px; padding-left: 6px; border-right: 1px solid #b8b8b8; white-space: nowrap;"><a href="https://metacpan.org/pod/Types::Standard#ArrayRef">ArrayRef</a> [ <a href="https://metacpan.org/pod/Types::Standard#Str">Str</a> ]</td>
267             <td style="padding-right: 6px; padding-left: 6px; border-right: 1px solid #b8b8b8; white-space: nowrap;">optional, default is a <code>coderef</code></td>
268             <td style="padding-left: 6px; padding-right: 6px; white-space: nowrap;">read/write</td>
269             </tr>
270             </table>
271              
272             <p>All alternative names for the station given in the map file.</p>
273              
274             =end markdown
275              
276             =head2 do_undiacritic
277              
278             =begin HTML
279              
280             <table cellpadding="0" cellspacing="0">
281             <tr>
282             <td style="padding-right: 6px; padding-left: 6px; border-right: 1px solid #b8b8b8; white-space: nowrap;"><a href="https://metacpan.org/pod/Types::Standard#Bool">Bool</a></td>
283             <td style="padding-right: 6px; padding-left: 6px; border-right: 1px solid #b8b8b8; white-space: nowrap;">optional, default: <code>1</code></td>
284             <td style="padding-right: 6px; padding-left: 6px; border-right: 1px solid #b8b8b8; white-space: nowrap;">read/write</td>
285             <td style="text-align: right; padding-right: 6px; padding-left: 6px;"><code>0</code>:</td>
286             <td style="padding-left: 12px;">Do not remove diacritics from station name.</td>
287             </tr>
288             <tr>
289             <td>&#160;</td>
290             <td>&#160;</td>
291             <td>&#160;</td>
292             <td style="text-align: right; padding-right: 6px; padding-left: 6px;"><code>1</code>:</td>
293             <td style="padding-left: 12px;">Do remove diacritics from station name.</td>
294             </tr>
295             </table>
296              
297             <p></p>
298              
299             =end HTML
300              
301             =begin markdown
302              
303             <table cellpadding="0" cellspacing="0">
304             <tr>
305             <td style="padding-right: 6px; padding-left: 6px; border-right: 1px solid #b8b8b8; white-space: nowrap;"><a href="https://metacpan.org/pod/Types::Standard#Bool">Bool</a></td>
306             <td style="padding-right: 6px; padding-left: 6px; border-right: 1px solid #b8b8b8; white-space: nowrap;">optional, default: <code>1</code></td>
307             <td style="padding-right: 6px; padding-left: 6px; border-right: 1px solid #b8b8b8; white-space: nowrap;">read/write</td>
308             <td style="text-align: right; padding-right: 6px; padding-left: 6px;"><code>1</code>:</td>
309             <td style="padding-left: 12px;">Do remove diacritics from station name.</td>
310             </tr>
311             </table>
312              
313             <p></p>
314              
315             =end markdown
316              
317             =head2 original_name
318              
319             =begin HTML
320              
321             <table cellpadding="0" cellspacing="0">
322             <tr>
323             <td style="padding-right: 6px; padding-left: 6px; border-right: 1px solid #b8b8b8; white-space: nowrap;"><a href="https://metacpan.org/pod/Types::Standard#Maybe">Maybe</a> [ <a href="https://metacpan.org/pod/Types::Standard#Str">Str</a> ]</td>
324             <td style="padding-right: 6px; padding-left: 6px; border-right: 1px solid #b8b8b8; white-space: nowrap;">optional</td>
325             <td style="padding-left: 6px; padding-right: 6px; white-space: nowrap;">read-only</td>
326             </tr>
327             </table>
328              
329             <p>The station's name as given in the map file.</p>
330              
331             =end HTML
332              
333             =begin markdown
334              
335             <table cellpadding="0" cellspacing="0">
336             <tr>
337             <td style="padding-right: 6px; padding-left: 6px; border-right: 1px solid #b8b8b8; white-space: nowrap;"><a href="https://metacpan.org/pod/Types::Standard#Maybe">Maybe</a> [ <a href="https://metacpan.org/pod/Types::Standard#Str">Str</a> ]</td>
338             <td style="padding-right: 6px; padding-left: 6px; border-right: 1px solid #b8b8b8; white-space: nowrap;">optional</td>
339             <td style="padding-left: 6px; padding-right: 6px; white-space: nowrap;">read-only</td>
340             </tr>
341             </table>
342              
343             <p>The station's name as given in the map file.</p>
344              
345             =end markdown
346              
347             =head2 search_names
348              
349             =begin HTML
350              
351             <table cellpadding="0" cellspacing="0">
352             <tr>
353             <td style="padding-right: 6px; padding-left: 6px; border-right: 1px solid #b8b8b8; white-space: nowrap;"><a href="https://metacpan.org/pod/Types::Standard#ArrayRef">ArrayRef</a> [ <a href="https://metacpan.org/pod/Types::Standard#Str">Str</a> ]</td>
354             <td style="padding-right: 6px; padding-left: 6px; border-right: 1px solid #b8b8b8; white-space: nowrap;">optional, default is a <code>coderef</code></td>
355             <td style="padding-left: 6px; padding-right: 6px; white-space: nowrap;">read/write</td>
356             </tr>
357             </table>
358              
359             <p>All search names for the station given in the map file.</p>
360              
361             =end HTML
362              
363             =begin markdown
364              
365             <table cellpadding="0" cellspacing="0">
366             <tr>
367             <td style="padding-right: 6px; padding-left: 6px; border-right: 1px solid #b8b8b8; white-space: nowrap;"><a href="https://metacpan.org/pod/Types::Standard#ArrayRef">ArrayRef</a> [ <a href="https://metacpan.org/pod/Types::Standard#Str">Str</a> ]</td>
368             <td style="padding-right: 6px; padding-left: 6px; border-right: 1px solid #b8b8b8; white-space: nowrap;">optional, default is a <code>coderef</code></td>
369             <td style="padding-left: 6px; padding-right: 6px; white-space: nowrap;">read/write</td>
370             </tr>
371             </table>
372              
373             <p>All search names for the station given in the map file.</p>
374              
375             =end markdown
376              
377             =head2 connecting_stations
378              
379             =begin HTML
380              
381             <table cellpadding="0" cellspacing="0">
382             <tr>
383             <td style="padding-right: 6px; padding-left: 6px; border-right: 1px solid #b8b8b8; white-space: nowrap;"><a href="https://metacpan.org/pod/Types::Standard#ArrayRef">ArrayRef</a> [ <a href="https://metacpan.org/pod/Map::Metro::Types#Station">Station</a> ]</td>
384             <td style="padding-right: 6px; padding-left: 6px; border-right: 1px solid #b8b8b8; white-space: nowrap;">not in constructor</td>
385             <td style="padding-left: 6px; padding-right: 6px; white-space: nowrap;">read-only</td>
386             </tr>
387             </table>
388              
389             <p>All stations one can travel to from this station without passing another station.</p>
390              
391             =end HTML
392              
393             =begin markdown
394              
395             <table cellpadding="0" cellspacing="0">
396             <tr>
397             <td style="padding-right: 6px; padding-left: 6px; border-right: 1px solid #b8b8b8; white-space: nowrap;"><a href="https://metacpan.org/pod/Types::Standard#ArrayRef">ArrayRef</a> [ <a href="https://metacpan.org/pod/Map::Metro::Types#Station">Station</a> ]</td>
398             <td style="padding-right: 6px; padding-left: 6px; border-right: 1px solid #b8b8b8; white-space: nowrap;">not in constructor</td>
399             <td style="padding-left: 6px; padding-right: 6px; white-space: nowrap;">read-only</td>
400             </tr>
401             </table>
402              
403             <p>All stations one can travel to from this station without passing another station.</p>
404              
405             =end markdown
406              
407             =head2 lines
408              
409             =begin HTML
410              
411             <table cellpadding="0" cellspacing="0">
412             <tr>
413             <td style="padding-right: 6px; padding-left: 6px; border-right: 1px solid #b8b8b8; white-space: nowrap;"><a href="https://metacpan.org/pod/Types::Standard#ArrayRef">ArrayRef</a> [ <a href="https://metacpan.org/pod/Types::Standard#Line">Line</a> ]</td>
414             <td style="padding-right: 6px; padding-left: 6px; border-right: 1px solid #b8b8b8; white-space: nowrap;">not in constructor</td>
415             <td style="padding-left: 6px; padding-right: 6px; white-space: nowrap;">read/write</td>
416             </tr>
417             </table>
418              
419             <p>All lines passing through this station.</p>
420              
421             =end HTML
422              
423             =begin markdown
424              
425             <table cellpadding="0" cellspacing="0">
426             <tr>
427             <td style="padding-right: 6px; padding-left: 6px; border-right: 1px solid #b8b8b8; white-space: nowrap;"><a href="https://metacpan.org/pod/Types::Standard#ArrayRef">ArrayRef</a> [ <a href="https://metacpan.org/pod/Types::Standard#Line">Line</a> ]</td>
428             <td style="padding-right: 6px; padding-left: 6px; border-right: 1px solid #b8b8b8; white-space: nowrap;">not in constructor</td>
429             <td style="padding-left: 6px; padding-right: 6px; white-space: nowrap;">read/write</td>
430             </tr>
431             </table>
432              
433             <p>All lines passing through this station.</p>
434              
435             =end markdown
436              
437             =head1 METHODS
438              
439             =head2 id()
440              
441             Returns the internal station id. Do not depend on this between executions.
442              
443             =head2 name()
444              
445             Returns the station name given in the parsed map file.
446              
447             =head2 lines()
448              
449             Returns an array of all L<Lines|Map::Metro::Graph::Line> passing through the station.
450              
451             =head2 connecting_stations()
452              
453             Returns an array of all L<Stations|Map::Metro::Graph::Station> directly (on at least one line) connected to this station.
454              
455             =head1 SOURCE
456              
457             L<https://github.com/Csson/p5-Map-Metro>
458              
459             =head1 HOMEPAGE
460              
461             L<https://metacpan.org/release/Map-Metro>
462              
463             =head1 AUTHOR
464              
465             Erik Carlsson <info@code301.com>
466              
467             =head1 COPYRIGHT AND LICENSE
468              
469             This software is copyright (c) 2016 by Erik Carlsson.
470              
471             This is free software; you can redistribute it and/or modify it under
472             the same terms as the Perl 5 programming language system itself.
473              
474             =cut