File Coverage

blib/lib/Daiku/Registry.pm
Criterion Covered Total %
statement 51 52 98.0
branch 11 12 91.6
condition n/a
subroutine 13 13 100.0
pod 2 3 66.6
total 77 80 96.2


line stmt bran cond sub pod time code
1 19     19   70 use strict;
  19         23  
  19         605  
2 19     19   71 use warnings FATAL => 'recursion';
  19         23  
  19         497  
3 19     19   571 use utf8;
  19         28  
  19         101  
4              
5 19     19   6100 use Daiku::Task;
  19         45  
  19         631  
6 19     19   6319 use Daiku::File;
  19         35  
  19         542  
7 19     19   6142 use Daiku::SuffixRule;
  19         37  
  19         525  
8              
9 19     19   8698 use Parse::CommandLine ();
  19         10078  
  19         374  
10 19     19   8960 use Tie::IxHash;
  19         59576  
  19         573  
11              
12             package Daiku::Registry;
13 19     19   101 use Mouse;
  19         26  
  19         155  
14              
15             has tasks => (
16             is => 'rw',
17             isa => 'HashRef',
18             default => sub { tie my %h, "Tie::IxHash"; \%h },
19             );
20              
21             has temporary_desc => (
22             is => 'rw',
23             isa => 'Str',
24             clearer => 'clear_temporary_desc',
25             );
26              
27             has namespaces => (
28             is => 'rw',
29             isa => 'ArrayRef',
30             default => sub { [] },
31             );
32              
33             sub register {
34 68     68 1 103 my ($self, $task) = (shift, shift);
35 68         221 my $orig = $self->find_task($task->dst);
36 68 100       156 $task->merge($orig) if $orig;
37 68         440 $self->tasks->{$task->dst} = $task;
38 68         1351 $task->registry($self);
39             }
40              
41             sub build {
42 50     50 1 78 my ($self, $target) = @_;
43 50 50       234 if (!defined $target) {
44 0         0 die "Missing target\n";
45             }
46              
47             # parsing 'task_name[arg1 arg2]'
48 50         375 ($target, my $argument) = $target =~ /\A([^\[]+)(?:\[(.*)\])?\z/ms;
49 50         106 my @args;
50 50 100       117 @args = Parse::CommandLine::parse_command_line($argument) if defined $argument;
51              
52 50         275 my $task = $self->find_task($target);
53 50 100       252 if ($task) {
54 47         133 return $task->build($target, @args);
55             } else {
56 3         25 die "There is no rule to build '$target'\n";
57             }
58             }
59              
60             sub find_task {
61 239     239 0 300 my ($self, $target) = @_;
62 239         219 for my $task (values %{$self->{tasks}}) {
  239         966  
63 546 100       4219 return $task if $task->match($target);
64             }
65 138 100       2014 if ( -e $target ) {
66 69         729 return Daiku::File->new( dst => $target );
67             }
68 69         114 return undef;
69             }
70              
71 19     19   10031 no Mouse; __PACKAGE__->meta->make_immutable;
  19         27  
  19         88  
72              
73             __END__