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   957710 use Mojo::Base -base;
  3         24  
  3         24  
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 43813 my $class = shift;
12 4         18 my $self = $class->SUPER::new(@_);
13              
14             # make shallow copy of class level rpcs
15 4 100 100     36 if ( ref $_rpcs eq 'HASH' && exists $_rpcs->{$class} ) {
16 1         1 $self->{_rpcs} = { %{ $_rpcs->{$class} } };
  1         9  
17             }
18 4         32 return $self;
19             }
20              
21             sub register_rpc_method_names {
22 1     1 1 80 my ( $class, @methods ) = @_;
23              
24             METHOD:
25 1         3 foreach my $m (@methods) {
26 8         14 my $name = $class . '::' . $m;
27 8         332 my $method = eval qq|*{*$name}{CODE}|;
28              
29 8 50       33 if ( ref $method ne 'CODE' ) {
30 0         0 Carp::croak
31             qq{register_rpc_method_names: $name not a method.};
32             }
33 8 50       18 if ( exists $_rpcs->{$class}->{$m} ) {
34 0         0 Carp::croak
35             qq{register_rpc_method_names: $name already registered.};
36             }
37 8         22 $_rpcs->{$class}->{$m} = { method => $method, with_svc_obj => 1 };
38             }
39              
40 1         2 return $class;
41             }
42             }
43              
44             sub register {
45 13     13 1 22 my ( $self, $name, $sub, $options ) = @_;
46              
47 13 50 33     40 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       30 if ( exists $self->{_rpcs}->{$name} ) {
54 0         0 Carp::croak qq{$name already registered};
55             }
56              
57 13   100     31 $options ||= {};
58 13 50       24 if ( ref $options ne 'HASH' ) {
59 0         0 Carp::croak 'options?';
60             }
61              
62 13         21 my %obj = ( method => $sub );
63             OPTION:
64 13         19 foreach my $opt ( 'with_mojo_tx', 'with_svc_obj', 'with_self' ) {
65 39 100       47 if ( !exists $options->{$opt} ) {
66 32         33 next OPTION;
67             }
68 7         8 $obj{$opt} = $options->{$opt};
69             }
70              
71 13         22 $self->{_rpcs}->{$name} = \%obj;
72 13         62 return $self;
73             }
74              
75             1;
76              
77             __END__