File Coverage

lib/Spoon/ContentObject.pm
Criterion Covered Total %
statement 38 65 58.4
branch 6 22 27.2
condition 2 8 25.0
subroutine 11 17 64.7
pod 0 14 0.0
total 57 126 45.2


line stmt bran cond sub pod time code
1             package Spoon::ContentObject;
2 2     2   65808 use Spoon::DataObject -Base;
  2         8  
  2         23  
3 2     2   2076  
  2     2   3  
  2         58  
  2         11  
  2         3  
  2         1589  
4             stub 'content';
5             stub 'metadata';
6             const is_readable => 1;
7             const is_writable => 1;
8              
9 4     4 0 21513 sub force {
10 4 100       17 if (@_) {
11 2         6 $self->{force} = shift;
12 2         5 return $self;
13             }
14 2   50     10 $self->{force} ||= 0;
15             }
16              
17 0     0 0 0 sub database_directory {
18 0         0 join '/', $self->hub->config->database_directory, $self->class_id;
19             }
20              
21 14     14 0 304 sub file_path {
22 14         35 join '/', $self->database_directory, $self->id;
23             }
24              
25 4     4 0 6 sub exists {
26 4         11 -e $self->file_path;
27             }
28              
29 4     4 0 231 sub deleted {
30 4         8 -z $self->file_path;
31             }
32              
33 4     4 0 8 sub active {
34 4   33     11 return $self->exists && not $self->deleted;
35             }
36              
37 4     4 0 7 sub assert_readable {
38 4 50       14 if (not $self->is_readable) {
39 0         0 my $id = $self->id;
40 0         0 die "$id is not readable";
41             }
42             }
43              
44 0     0 0 0 sub assert_writable {
45 0 0       0 if (not $self->is_writable) {
46 0         0 my $id = $self->id;
47 0         0 die "$id is not writable";
48             }
49             }
50              
51 0     0 0 0 sub load {
52 0         0 $self->load_content;
53 0         0 $self->load_metadata;
54 0         0 return $self;
55             }
56              
57 4     4 0 27093 sub load_content {
58 4         14 $self->assert_readable;
59 4 50       32 my $content = $self->active
60             ? io($self->file_path)->utf8->all
61             : '';
62 4         24913 $self->content($content);
63 4         215 return $self;
64             }
65              
66 0     0 0 0 sub load_metadata {
67 0 0       0 my $metadata = $self->{metadata}
68             or die "No metadata object in content object";
69 0         0 $metadata->load;
70 0         0 return $self;
71             }
72              
73 0     0 0 0 sub store {
74 0         0 $self->assert_writable;
75 0 0       0 $self->store_content or return;
76 0         0 $self->store_metadata;
77 0 0       0 return if $self->force;
78 0         0 return $self;
79             }
80              
81 2     2 0 8 sub store_content {
82 2         51 my $content = $self->content;
83 2 50       15 if ($content) {
84 2         7 $content =~ s/\r//g;
85 2         20 $content =~ s/\n*\z/\n/;
86             }
87 2         7 my $file = io->file($self->file_path)->utf8;
88 2 50       511 unless ($self->force) {
89 0 0 0     0 return if $file->exists and
90             $content eq $file->all;
91             }
92 2         15 $file->print($content);
93 2         178252 return $self;
94             }
95              
96 0     0 0   sub store_metadata {
97 0 0         my $metadata = $self->{metadata}
98             or die "No metadata for content object";
99 0           $metadata->store;
100 0           return $self;
101             }
102              
103             __DATA__