File Coverage

blib/lib/REST/Cot/Fragment.pm
Criterion Covered Total %
statement 45 52 86.5
branch 3 4 75.0
condition 2 2 100.0
subroutine 11 19 57.8
pod 0 6 0.0
total 61 83 73.4


line stmt bran cond sub pod time code
1             package REST::Cot::Fragment;
2             $REST::Cot::Fragment::VERSION = '0.006';
3 2     2   411 use 5.16.0;
  2         4  
4 2     2   7 use strict;
  2         1  
  2         28  
5 2     2   6 use warnings;
  2         6  
  2         37  
6              
7             # TODO: trace interface topology for SPORE spec?
8             # TODO: trace interface topology for Swagger spec?
9              
10 2     2   744 use namespace::autoclean;
  2         22505  
  2         5  
11 2     2   826 use Hash::Merge::Simple 'merge';
  2         650  
  2         90  
12 2     2   686 use REST::Cot::Generators;
  2         2  
  2         153  
13             use overload
14             '""' => sub {
15 424     424   707 my $self = shift;
16             return $self->{uri}
17             ->()
18             ->as_string()
19 424 100       722 if ref($self->{uri}) eq 'CODE';
20              
21 294         356 return $self->{path}->();
22             },
23 1     1   285 '~' => sub { shift->{progenitor}->() },
24 2     2   8 'fallback' => 1;
  2         3  
  2         18  
25              
26             our $AUTOLOAD;
27              
28             sub AUTOLOAD {
29 23     23   6619 my $self = shift;
30 23 50       52 my $type = ref($self)
31             or return;
32 23         28 my @args = @_;
33 23         18 my $fragment = $AUTOLOAD;
34              
35 23         70 $fragment =~ s/.*:://;
36              
37             # DISABLE fragment caching, this is slower but the interface works correctly
38             # return $self->{fragments}->{$fragment}->()
39             # if exists $self->{fragments}->{$fragment};
40              
41             my $sub = sub {
42 23     23   38 my $new = bless({}, __PACKAGE__);
43              
44 23         27 $new->{parent} = $self;
45 23         26 $new->{name} = $fragment;
46 23         22 $new->{query} = {};
47 23         19 $new->{client} = $self->{client};
48              
49 23         39 $new->{args} = [grep { !ref($_) } @args];
  12         34  
50 23   100     32 $new->{query} = merge(grep { ref($_) eq 'HASH'} @args) || {};
51              
52 23         175 $new->{progenitor} = REST::Cot::Generators::progenitor($new);
53 23         34 $new->{uri} = REST::Cot::Generators::uri($new);
54 23         32 $new->{path} = REST::Cot::Generators::path($new);
55 23         35 $new->{method} = REST::Cot::Generators::method($new);
56 23         32 $new->{merged_query} = REST::Cot::Generators::merged_query($new);
57              
58 23         98 return $new;
59 23         54 };
60              
61 23         61 return ($self->{fragments}->{$fragment} = $sub)->();
62             }
63              
64       0     sub DESTROY {
65             # We don't want this being called via autoload since an object is out of scope by this point
66             }
67              
68 0     0 0   sub GET { shift->{method}->( 'GET', @_ ); }
69 0     0 0   sub PUT { shift->{method}->( 'PUT', @_ ); }
70 0     0 0   sub PATCH { shift->{method}->( 'PATCH', @_ ); }
71 0     0 0   sub POST { shift->{method}->( 'POST', @_ ); }
72 0     0     sub DELETE { shift->{method}->( 'DELETE', @_ ); }
73 0     0 0   sub OPTIONS { shift->{method}->( 'OPTIONS', @_ ); }
74 0     0 0   sub HEAD { shift->{method}->( 'HEAD', @_ ); }
75              
76             1;
77              
78             __END__