File Coverage

blib/lib/KiokuDB/TypeMap/Entry/Set.pm
Criterion Covered Total %
statement 18 63 28.5
branch 0 12 0.0
condition n/a
subroutine 6 18 33.3
pod 0 5 0.0
total 24 98 24.4


line stmt bran cond sub pod time code
1             #!/usr/bin/perl
2              
3             package KiokuDB::TypeMap::Entry::Set;
4 12     12   7952 use Moose;
  12         20  
  12         80  
5              
6 12     12   61627 no warnings 'recursion';
  12         25  
  12         899  
7              
8 12     12   5498 use KiokuDB::Set::Stored;
  12         32  
  12         411  
9 12     12   5539 use KiokuDB::Set::Deferred;
  12         33  
  12         477  
10 12     12   83 use KiokuDB::Set::Loaded;
  12         18  
  12         366  
11              
12 12     12   55 use namespace::clean -except => 'meta';
  12         18  
  12         95  
13              
14             with qw(
15             KiokuDB::TypeMap::Entry::Std
16             KiokuDB::TypeMap::Entry::Std::Expand
17             );
18              
19             has defer => (
20             isa => "Bool",
21             is => "ro",
22             default => 1,
23             );
24              
25             sub compile_collapse_wrapper {
26 0     0 0   my ( $self, $method, $class, @args ) = @_;
27              
28 0           my ( $body, @extra ) = $self->compile_collapse_body(@args);
29              
30             return sub {
31 0     0     shift->$method( $body, @extra, @_, class => "KiokuDB::Set::Stored" );
32             }
33 0           }
34              
35             sub compile_collapse_body {
36 0     0 0   my ( $self, $class ) = @_;
37              
38 0 0         if ( $class->isa("KiokuDB::Set::Deferred") ) {
39             # if it's deferred we just return the IDs
40             return sub {
41 0     0     my ( $collapser, %args ) = @_;
42              
43 0           return $collapser->make_entry(
44             %args,
45             data => [ $args{object}->_objects->members ],
46             );
47 0           };
48             } else {
49             # otherwise we collapse the objects recursively
50             return sub {
51 0     0     my ( $collapser, %args ) = @_;
52              
53 0           my @inner = $collapser->visit($args{object}->_objects->members);
54              
55             # we flatten references to just IDs
56 0           foreach my $item ( @inner ) {
57 0 0         $item = $item->id if ref($item) eq 'KiokuDB::Reference';
58 0           $collapser->_buffer->first_class->insert($item); # mark it first class so it doesn't get compacted
59             }
60              
61 0           return $collapser->make_entry(
62             %args,
63             data => \@inner,
64             );
65 0           };
66             }
67             }
68              
69             sub compile_create {
70 0     0 0   my ( $self, $class ) = @_;
71              
72 0 0         if ( $self->defer ) {
73             return sub {
74 0     0     my ( $linker, $entry ) = @_;
75              
76 0           my $members = $entry->data;
77              
78 0 0         if ( grep { ref } @$members ) {
  0            
79 0           return KiokuDB::Set::Loaded->new( set => Set::Object::Weak->new(), _linker => $linker );
80             } else {
81 0           return KiokuDB::Set::Deferred->new( set => Set::Object->new( @$members ), _linker => $linker );
82             }
83 0           };
84             } else {
85             return sub {
86 0     0     my ( $linker, $entry ) = @_;
87              
88 0           return KiokuDB::Set::Loaded->new( set => Set::Object::Weak->new, _linker => $linker );
89 0           };
90             }
91             }
92              
93             sub compile_clear {
94 0     0 0   my ( $self, $class ) = @_;
95              
96             sub {
97 0     0     my ( $linker, $obj ) = @_;
98 0           $obj->_set_ids( Set::Object->new() );
99             }
100 0           }
101              
102             sub compile_expand_data {
103 0     0 0   my ( $self, $class ) = @_;
104              
105 0           my $defer = $self->defer;
106              
107             return sub {
108 0     0     my ( $linker, $instance, $entry ) = @_;
109              
110 0           my $members = $entry->data;
111              
112 0           my $inner_set = $instance->_objects;
113              
114 0 0         if ( ref $instance eq 'KiokuDB::Set::Deferred' ) {
115 0           $inner_set->insert( @$members );
116             } else {
117 0           foreach my $item ( @$members ) {
118 0 0         if ( ref $item ) {
119 0           $linker->inflate_data( $item, \( my $obj ) );
120 0           $inner_set->insert( $obj );
121             } else {
122             # FIXME add partially loaded set support
123 0           $inner_set->insert( $linker->get_or_load_object($item) );
124             }
125             }
126             }
127             }
128 0           }
129              
130             __PACKAGE__->meta->make_immutable;
131              
132             __PACKAGE__
133              
134             __END__
135              
136             =pod
137              
138             =head1 NAME
139              
140             KiokuDB::TypeMap::Entry::Set - A typemap entry for L<KiokuDB::Set>s
141              
142             =head1 DESCRIPTION
143              
144             This is an internal typemap entry that handles L<KiokuDB::Set> objects of
145             various flavours.
146              
147             You shouldn't need to use it directly, as the default typemap will contain an
148             entry for it.