File Coverage

lib/MojoX/JSON/RPC/Service.pm
Criterion Covered Total %
statement 30 36 83.3
branch 10 16 62.5
condition 6 8 75.0
subroutine 4 4 100.0
pod 3 3 100.0
total 53 67 79.1


line stmt bran cond sub pod time code
1             package MojoX::JSON::RPC::Service;
2              
3 3     3   1239723 use Mojo::Base -base;
  3         17  
  3         19  
4              
5             {
6              
7             # Store rpc methods registered by register_rpc_method_names
8             my $_rpcs = undef;
9              
10             sub new {
11 4     4 1 34777 my $class = shift;
12 4         30 my $self = $class->SUPER::new(@_);
13              
14             # make shallow copy of class level rpcs
15 4 100 100     43 if ( ref $_rpcs eq 'HASH' && exists $_rpcs->{$class} ) {
16 1         3 $self->{_rpcs} = { %{ $_rpcs->{$class} } };
  1         12  
17             }
18 4         30 return $self;
19             }
20              
21             sub register_rpc_method_names {
22 1     1 1 128 my ( $class, @methods ) = @_;
23              
24             METHOD:
25 1         3 foreach my $m (@methods) {
26 8         19 my $name = $class . '::' . $m;
27 8         382 my $method = eval qq|*{*$name}{CODE}|;
28              
29 8 50       40 if ( ref $method ne 'CODE' ) {
30 0         0 Carp::croak
31             qq{register_rpc_method_names: $name not a method.};
32             }
33 8 50       20 if ( exists $_rpcs->{$class}->{$m} ) {
34 0         0 Carp::croak
35             qq{register_rpc_method_names: $name already registered.};
36             }
37 8         73 $_rpcs->{$class}->{$m} = { method => $method, with_svc_obj => 1 };
38             }
39              
40 1         3 return $class;
41             }
42             }
43              
44             sub register {
45 13     13 1 28 my ( $self, $name, $sub, $options ) = @_;
46              
47 13 50 33     45 if ( !defined $name || $name eq q{} ) {
48 0         0 Carp::croak 'name?';
49             }
50 13 50       24 if ( ref $sub ne 'CODE' ) {
51 0         0 Carp::croak qq{name[$name] code?};
52             }
53 13 50       34 if ( exists $self->{_rpcs}->{$name} ) {
54 0         0 Carp::croak qq{$name already registered};
55             }
56              
57 13   100     34 $options ||= {};
58 13 50       29 if ( ref $options ne 'HASH' ) {
59 0         0 Carp::croak 'options?';
60             }
61              
62 13         21 my %obj = ( method => $sub );
63             OPTION:
64 13         18 foreach my $opt ( 'with_mojo_tx', 'with_svc_obj', 'with_self' ) {
65 39 100       58 if ( !exists $options->{$opt} ) {
66 32         35 next OPTION;
67             }
68 7         11 $obj{$opt} = $options->{$opt};
69             }
70              
71 13         23 $self->{_rpcs}->{$name} = \%obj;
72 13         70 return $self;
73             }
74              
75             1;
76              
77             __END__