File Coverage

blib/lib/IPC/Manager.pm
Criterion Covered Total %
statement 56 73 76.7
branch 7 12 58.3
condition 7 12 58.3
subroutine 13 17 76.4
pod 6 6 100.0
total 89 120 74.1


line stmt bran cond sub pod time code
1             package IPC::Manager;
2 2     2   925 use strict;
  2         3  
  2         86  
3 2     2   9 use warnings;
  2         3  
  2         144  
4              
5             our $VERSION = '0.000005';
6              
7 2     2   10 use Carp qw/croak/;
  2         3  
  2         91  
8              
9 2     2   942 use IPC::Manager::Spawn();
  2         5  
  2         46  
10 2     2   14 use IPC::Manager::Serializer::JSON();
  2         3  
  2         42  
11              
12 2     2   1161 use Importer Importer => 'import';
  2         12304  
  2         20  
13              
14             our @EXPORT_OK = qw/ipcm_connect ipcm_reconnect ipcm_spawn ipcm/;
15              
16             sub ipcm() { __PACKAGE__ }
17 0     0 1 0 sub connect { shift; ipcm_connect(@_) }
  0         0  
18 0     0 1 0 sub reconnect { shift; ipcm_reconnect(@_) }
  0         0  
19 0     0 1 0 sub spawn { shift; ipcm_spawn(@_) }
  0         0  
20 6     6 1 2783 sub ipcm_connect { _connect(connect => @_) }
21 0     0 1 0 sub ipcm_reconnect { _connect(reconnect => @_) }
22              
23             sub _parse_cinfo {
24 6     6   12 my $cinfo = shift;
25              
26 6         11 my ($protocol, $route, $serializer);
27              
28 6         38 my $rtype = ref $cinfo;
29 6 50       42 if ($rtype eq 'ARRAY') {
    50          
30 0         0 ($protocol, $serializer, $route) = @$cinfo;
31             }
32             elsif (!$rtype) {
33 6         11 ($protocol, $serializer, $route) = @{IPC::Manager::Serializer::JSON->deserialize($cinfo)};
  6         29  
34 6         19 $protocol = _parse_protocol($protocol);
35 6         14 $serializer = _parse_serializer($serializer);
36             }
37             else {
38 0         0 croak "Not sure what to do with $cinfo";
39             }
40              
41 6         17 _require_mod($protocol);
42 6         15 _require_mod($serializer);
43              
44 6         18 return ($protocol, $serializer, $route);
45             }
46              
47             sub _parse_protocol {
48 8     8   14 my $protocol = shift;
49 8 100 66     61 $protocol = "IPC::Manager::Client::$protocol" unless $protocol =~ s/^\+// || $protocol =~ m/^IPC::Manager::Client::/;
50 8         24 return $protocol;
51             }
52              
53             sub _parse_serializer {
54 8     8   16 my $serializer = shift;
55 8 100 66     50 $serializer = "IPC::Manager::Serializer::$serializer" unless $serializer =~ s/^\+// || $serializer =~ m/^IPC::Manager::Serializer::/;
56 8         43 return $serializer;
57             }
58              
59             sub _connect {
60 6     6   22 my ($meth, $id, $cinfo, %params) = @_;
61              
62 6         16 my ($protocol, $serializer, $route) = _parse_cinfo($cinfo);
63              
64 6         75 return $protocol->$meth($id, $serializer, $route, %params);
65             }
66              
67             sub _require_mod {
68 16     16   28 my $mod = shift;
69              
70 16         34 my $file = $mod;
71 16         68 $file =~ s{::}{/}g;
72 16         31 $file .= ".pm";
73              
74 16         1157 require($file);
75             }
76              
77             sub ipcm_spawn {
78 2     2 1 16016 my %params = @_;
79              
80 2   50     15 my $guard = delete $params{guard} // 1;
81 2   50     12 my $serializer = delete $params{serializer} // 'JSON';
82 2         4 my $protocol = delete $params{protocol};
83             my $protocols = delete $params{procotols} // [
84 2   50     12 'PostgreSQL',
85             'MariaDB',
86             'MySQL',
87             'SQLite',
88             'UnixSocket',
89             'AtomicPipe',
90             'MessageFiles',
91             ];
92              
93 2 50       9 if ($protocol) {
94 2         5 $protocol = _parse_protocol($protocol);
95 2         6 _require_mod($protocol);
96             }
97             else {
98 0         0 for my $prot (@$protocols) {
99 0         0 $prot = _parse_protocol($prot);
100              
101 0         0 local $@;
102 0 0       0 eval { _require_mod($prot); $prot->viable } or next;
  0         0  
  0         0  
103              
104 0         0 $protocol = $prot;
105 0         0 last;
106             }
107             }
108              
109 2         13 $serializer = _parse_serializer($serializer);
110 2         7 _require_mod($serializer);
111              
112 2         20 my ($route, $stash) = $protocol->spawn(%params, serializer => $serializer);
113              
114 2         21 return IPC::Manager::Spawn->new(
115             protocol => $protocol,
116             serializer => $serializer,
117             route => $route,
118             stash => $stash,
119             guard => $guard,
120             );
121             }
122              
123             1;
124              
125             __END__