File Coverage

lib/Ubic/Multiservice.pm
Criterion Covered Total %
statement 59 68 86.7
branch 17 20 85.0
condition n/a
subroutine 11 13 84.6
pod 5 5 100.0
total 92 106 86.7


line stmt bran cond sub pod time code
1             package Ubic::Multiservice;
2             # ABSTRACT: interface of multiservice representing several named services
3             $Ubic::Multiservice::VERSION = '1.58_01'; # TRIAL
4 27     27   11014 use strict;
  27         51  
  27         841  
5 27     27   306 use warnings;
  27         44  
  27         1412  
6              
7             sub simple_service($$);
8              
9             sub service_names($);
10              
11              
12              
13 27     27   137 use Carp;
  27         31  
  27         1881  
14 27     27   153 use Params::Validate qw(:all);
  27         46  
  27         6084  
15 27     27   188 use Try::Tiny;
  27         39  
  27         1732  
16 27     27   128 use parent qw(Ubic::Service);
  27         36  
  27         230  
17              
18             sub service($$) {
19 65     65 1 97 my $self = shift;
20 65         1011 my ($name) = validate_pos(@_, { type => SCALAR, regex => qr{^[\w-]+(?:\.[\w-]+)*$} });
21 65         917 my @parts = split '\\.', $name;
22              
23 65 100       294 if ($self->{service_cache}{$name}) {
24 10 50       24 if (my $error = $self->{service_cache}{$name}{error}) {
25 0         0 die $error;
26             }
27             else {
28 10         36 return $self->{service_cache}{$name}{service};
29             }
30             }
31              
32 55         63 my $service;
33             try {
34 55 100   55   1769 if (@parts == 1) {
35 46         222 $service = $self->simple_service($name);
36 42 100       154 unless (defined $service->name) {
37 5         11 $service->name($name);
38             }
39 42         255 $service->parent_name($self->full_name);
40             }
41             else {
42             # complex service
43 9         42 my $top_level = $self->simple_service($parts[0]);
44 9 50       90 unless ($top_level->isa('Ubic::Multiservice')) {
45 0         0 croak "top-level service '$parts[0]' is not a multiservice";
46             }
47 9 100       25 unless (defined $top_level->name) {
48 3         5 $top_level->name($parts[0]);
49             }
50 9         38 $top_level->parent_name($self->full_name);
51 9         70 $service = $top_level->service(join '.', @parts[1..$#parts]);
52             }
53 49         311 $self->{service_cache}{$name} = { service => $service };
54             }
55             catch {
56 6     6   406 $self->{service_cache}{$name} = { error => $_ };
57 6         48 die $_;
58 55         582 };
59 49         1321 return $service;
60             }
61              
62              
63             sub has_service($$) {
64 27     27 1 1296 my $self = shift;
65 27         456 my ($name) = validate_pos(@_, { type => SCALAR, regex => qr{^[\w-]+(?:\.[\w-]+)*$} });
66 27         421 my @parts = split '\\.', $name;
67 27 100       81 if (@parts == 1) {
68 21         115 return $self->has_simple_service($name);
69             }
70             # complex service
71 6 100       18 return undef unless $self->has_service($parts[0]);
72 5         11 my $top_level = $self->service($parts[0]);
73 5 100       21 unless ($top_level->isa('Ubic::Multiservice')) {
74             # strange, top-level service is not a multiservice
75 3         8 return undef;
76             }
77 2         9 return $top_level->has_service(join '.', @parts[1..$#parts]);
78             }
79              
80             sub services($) {
81 2     2 1 5 my $self = shift;
82 2         4 my @services;
83 2         69 for my $name ($self->service_names) {
84 12         15 my $service = eval { $self->service($name) };
  12         31  
85 12 50       27 if ($@) {
86 0         0 warn "Can't construct '$name': $@";
87 0         0 next;
88             }
89 12         22 push @services, $service;
90             }
91 2         17 return @services;
92             }
93              
94             sub has_simple_service($$) {
95 0     0 1   my $self = shift;
96 0           my ($name) = validate_pos(@_, { type => SCALAR, regex => qr{^[\w-]+$} });
97 0           return grep { $_ eq $name } $self->service_names;
  0            
98             }
99              
100             sub multiop($) {
101 0     0 1   return 'allowed';
102             }
103              
104              
105             1;
106              
107             __END__