File Coverage

blib/lib/RDF/DOAP/Resource.pm
Criterion Covered Total %
statement 43 68 63.2
branch 13 32 40.6
condition 4 17 23.5
subroutine 8 13 61.5
pod 0 7 0.0
total 68 137 49.6


line stmt bran cond sub pod time code
1             package RDF::DOAP::Resource;
2              
3             our $AUTHORITY = 'cpan:TOBYINK';
4             our $VERSION = '0.103';
5              
6 2     2   1473 use Moose;
  2         5  
  2         16  
7              
8 2     2   14015 use Carp;
  2         6  
  2         177  
9 2     2   15 use RDF::DOAP::Types -types;
  2         4  
  2         73  
10 2     2   11488 use RDF::DOAP::Utils -traits;
  2         5  
  2         13  
11 2     2   728 use Scalar::Util qw( weaken refaddr );
  2         5  
  2         128  
12              
13 2     2   14 use RDF::Trine::Namespace qw(rdf rdfs owl xsd);
  2         4  
  2         18  
14              
15             has rdf_about => (
16             is => 'ro',
17             isa => Identifier,
18             coerce => 1,
19             predicate => 'has_rdf_about',
20             );
21              
22             has rdf_model => (
23             is => 'ro',
24             isa => Model,
25             predicate => 'has_rdf_model',
26             );
27              
28             has rdf_type => (
29             traits => [ WithURI ],
30             is => 'ro',
31             isa => ArrayRef[Identifier],
32             coerce => 1,
33             uri => $rdf->type,
34             multi => 1,
35             default => sub { [] },
36             );
37              
38             has $_ => (
39             traits => [ WithURI ],
40             is => 'ro',
41             isa => String,
42             coerce => 1,
43             uri => $rdfs->$_,
44             ) for qw( label comment );
45              
46             has see_also => (
47             traits => [ WithURI ],
48             is => 'ro',
49             isa => ArrayRef[Identifier],
50             coerce => 1,
51             uri => $rdfs->seeAlso,
52             multi => 1,
53             lazy => 1,
54             default => sub {
55             my $self = shift;
56             if ($self->has_rdf_about && $self->rdf_about =~ /^tdb:[^:]*:(.*)$/)
57             {
58             return [ Identifier->coerce($1) ];
59             }
60             return [];
61             },
62             );
63              
64             our $MODEL;
65             my %objects;
66             sub rdf_load
67             {
68 42     42 0 43575 my $class = shift;
69 42         140 my $identifier = Identifier->assert_coerce( $_[0] );
70            
71 42 100       3102 my $model = $_[1] ? Model->assert_return( $_[1] ) : $MODEL or die;
    50          
72              
73             return $objects{ refaddr($model) }{ $identifier }
74 42 100       279 if $objects{ refaddr($model) }{ $identifier };
75            
76 32         477 my (%attr, %multi);
77 32         194 for my $a ($class->meta->get_all_attributes)
78             {
79 346 100       21603 $a->does(WithURI) or next;
80 262   33     73877 $attr{ $a->uri } = $a->init_arg || $a->name;
81 262         23024 $multi{ $a->uri } = $a->multi;
82             }
83            
84 32         1849 my %args = (
85             rdf_about => $identifier,
86             rdf_model => $model,
87             );
88 32         159 my $iter = $model->get_statements($identifier, undef, undef);
89 32         109389 while (my $st = $iter->next)
90             {
91 138 100       17414 my $name = $attr{ $st->predicate } or next;
92            
93 111 100       2138 if ($multi{ $st->predicate })
94             {
95 58   100     900 push @{ $args{$name} ||= [] }, $st->object;
  58         310  
96             }
97             else
98             {
99 53   33     932 $args{$name} ||= $st->object;
100             }
101             }
102            
103 32         1573 local $MODEL = $model;
104 32         224 my $self = $objects{ refaddr($model) }{ $identifier } = $class->new(%args);
105 32         63618 weaken($objects{ refaddr($model) }{ $identifier });
106 32         1130 return $self;
107             }
108              
109             sub rdf_get
110             {
111 0     0 0 0 my $self = shift;
112 0 0 0     0 croak "This object cannot rdf_get; stopped"
113             unless $self->has_rdf_model && $self->has_rdf_about;
114            
115 0         0 my @values = $self->rdf_model->objects_for_predicate_list($self->rdf_about, @_);
116 0 0       0 wantarray ? @values : $values[0];
117             }
118              
119             sub rdf_get_literal
120             {
121 0     0 0 0 my $self = shift;
122 0         0 my @values = grep $_->is_literal, $self->rdf_get(@_);
123 0 0       0 wantarray ? @values : $values[0];
124             }
125              
126             sub rdf_get_uri
127             {
128 0     0 0 0 my $self = shift;
129 0         0 my @values = grep $_->is_resource, $self->rdf_get(@_);
130 0 0       0 wantarray ? @values : $values[0];
131             }
132              
133             sub TO_JSON
134             {
135 0     0 0 0 my $self = shift;
136 0 0       0 $self->fixes if $self->can('fixes');
137 0         0 my $hash = +{ %$self };
138 0         0 delete $hash->{$_} for qw( rdf_about rdf_model );
139 0         0 for my $k (keys %$hash) {
140 0 0 0     0 if (blessed $hash->{$k} and $hash->{$k}->isa('RDF::Trine::Node')) {
141 0         0 $hash->{$k} = $hash->{$k}->as_ntriples;
142             }
143 0 0       0 if (ref $hash->{$k} eq 'ARRAY') {
144             $hash->{$k} = [ map {
145 0 0 0     0 (blessed $_ and $_->isa('RDF::Trine::Node')) ? $_->as_ntriples : $_
146 0         0 } @{ $hash->{$k} } ];
  0         0  
147             }
148             }
149 0 0       0 $hash->{'@'} = $self->rdf_about->as_ntriples if $self->has_rdf_about;
150             # $hash->{__ISA__} = [ $self->meta->linearized_isa ];
151             # $hash->{__DOES__} = [ map $_->name, $self->meta->calculate_all_roles_with_inheritance ];
152 0         0 return $hash;
153             }
154              
155             sub dump_json
156             {
157 0     0 0 0 require JSON;
158 0         0 JSON::to_json(
159             shift(),
160             { pretty => 1, canonical => 1, convert_blessed => 1 },
161             );
162             }
163              
164             sub isa
165             {
166 193     193 0 36726 my $self = shift;
167            
168 193 100       515 return grep($_[0]->equal($_), @{$self->rdf_type})
  54         2083  
169             if Identifier->check(@_);
170            
171 139         2660 $self->SUPER::isa(@_);
172             }
173              
174             1;