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.59';
4 25     25   7078 use strict;
  25         27  
  25         577  
5 25     25   80 use warnings;
  25         26  
  25         911  
6              
7             sub simple_service($$);
8              
9             sub service_names($);
10              
11              
12              
13 25     25   83 use Carp;
  25         26  
  25         1221  
14 25     25   96 use Params::Validate qw(:all);
  25         29  
  25         3733  
15 25     25   126 use Try::Tiny;
  25         22  
  25         1187  
16 25     25   91 use parent qw(Ubic::Service);
  25         34  
  25         145  
17              
18             sub service($$) {
19 55     55 1 66 my $self = shift;
20 55         627 my ($name) = validate_pos(@_, { type => SCALAR, regex => qr{^[\w-]+(?:\.[\w-]+)*$} });
21 55         614 my @parts = split '\\.', $name;
22              
23 55 100       203 if ($self->{service_cache}{$name}) {
24 10 50       20 if (my $error = $self->{service_cache}{$name}{error}) {
25 0         0 die $error;
26             }
27             else {
28 10         28 return $self->{service_cache}{$name}{service};
29             }
30             }
31              
32 45         42 my $service;
33             try {
34 45 100   45   1106 if (@parts == 1) {
35 38         165 $service = $self->simple_service($name);
36 36 100       132 unless (defined $service->name) {
37 5         8 $service->name($name);
38             }
39 36         147 $service->parent_name($self->full_name);
40             }
41             else {
42             # complex service
43 7         31 my $top_level = $self->simple_service($parts[0]);
44 7 50       50 unless ($top_level->isa('Ubic::Multiservice')) {
45 0         0 croak "top-level service '$parts[0]' is not a multiservice";
46             }
47 7 100       19 unless (defined $top_level->name) {
48 3         6 $top_level->name($parts[0]);
49             }
50 7         22 $top_level->parent_name($self->full_name);
51 7         37 $service = $top_level->service(join '.', @parts[1..$#parts]);
52             }
53 42         181 $self->{service_cache}{$name} = { service => $service };
54             }
55             catch {
56 3     3   135 $self->{service_cache}{$name} = { error => $_ };
57 3         15 die $_;
58 45         387 };
59 42         863 return $service;
60             }
61              
62              
63             sub has_service($$) {
64 23     23 1 1072 my $self = shift;
65 23         298 my ($name) = validate_pos(@_, { type => SCALAR, regex => qr{^[\w-]+(?:\.[\w-]+)*$} });
66 23         258 my @parts = split '\\.', $name;
67 23 100       53 if (@parts == 1) {
68 17         69 return $self->has_simple_service($name);
69             }
70             # complex service
71 6 100       15 return undef unless $self->has_service($parts[0]);
72 5         10 my $top_level = $self->service($parts[0]);
73 5 100       19 unless ($top_level->isa('Ubic::Multiservice')) {
74             # strange, top-level service is not a multiservice
75 3         7 return undef;
76             }
77 2         9 return $top_level->has_service(join '.', @parts[1..$#parts]);
78             }
79              
80             sub services($) {
81 2     2 1 4 my $self = shift;
82 2         3 my @services;
83 2         68 for my $name ($self->service_names) {
84 12         11 my $service = eval { $self->service($name) };
  12         23  
85 12 50       20 if ($@) {
86 0         0 warn "Can't construct '$name': $@";
87 0         0 next;
88             }
89 12         20 push @services, $service;
90             }
91 2         15 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__