Bug 14544: Make the intranet side independent of Page.pm
[koha.git] / Koha / Objects.pm
1 package Koha::Objects;
2
3 # Copyright ByWater Solutions 2014
4 #
5 # This file is part of Koha.
6 #
7 # Koha is free software; you can redistribute it and/or modify it under the
8 # terms of the GNU General Public License as published by the Free Software
9 # Foundation; either version 3 of the License, or (at your option) any later
10 # version.
11 #
12 # Koha is distributed in the hope that it will be useful, but WITHOUT ANY
13 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
14 # A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License along
17 # with Koha; if not, write to the Free Software Foundation, Inc.,
18 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19
20 use Modern::Perl;
21
22 use Carp;
23
24 use Koha::Database;
25
26 our $type;
27
28 =head1 NAME
29
30 Koha::Objects - Koha Object set base class
31
32 =head1 SYNOPSIS
33
34     use Koha::Objects;
35     my @objects = Koha::Objects->search({ borrowernumber => $borrowernumber});
36
37 =head1 DESCRIPTION
38
39 This class must be subclassed.
40
41 =head1 API
42
43 =head2 Class Methods
44
45 =cut
46
47 =head3 Koha::Objects->new();
48
49 my $object = Koha::Objects->new();
50
51 =cut
52
53 sub new {
54     my ($class) = @_;
55     my $self = {};
56
57     bless( $self, $class );
58 }
59
60 =head3 Koha::Objects->_new_from_dbic();
61
62 my $object = Koha::Objects->_new_from_dbic( $resultset );
63
64 =cut
65
66 sub _new_from_dbic {
67     my ( $class, $resultset ) = @_;
68     my $self = { _resultset => $resultset };
69
70     bless( $self, $class );
71 }
72
73 =head3 Koha::Objects->find();
74
75 my $object = Koha::Objects->find($id);
76 my $object = Koha::Objects->find( { keypart1 => $keypart1, keypart2 => $keypart2 } );
77
78 =cut
79
80 sub find {
81     my ( $self, $id ) = @_;
82
83     return unless $id;
84
85     my $result = $self->_resultset()->find($id);
86
87     return unless $result;
88
89     my $object = $self->object_class()->_new_from_dbic( $result );
90
91     return $object;
92 }
93
94 =head3 Koha::Objects->search();
95
96 my @objects = Koha::Objects->search($params);
97
98 =cut
99
100 sub search {
101     my ( $self, $params, $attributes ) = @_;
102
103     if (wantarray) {
104         my @dbic_rows = $self->_resultset()->search($params, $attributes);
105
106         return $self->_wrap(@dbic_rows);
107
108     }
109     else {
110         my $class = ref($self) ? ref($self) : $self;
111         my $rs = $self->_resultset()->search($params, $attributes);
112
113         return $class->_new_from_dbic($rs);
114     }
115 }
116
117 =head3 Koha::Objects->count();
118
119 my @objects = Koha::Objects->count($params);
120
121 =cut
122
123 sub count {
124     my ( $self, $params ) = @_;
125
126     return $self->_resultset()->count($params);
127 }
128
129 =head3 Koha::Objects->next();
130
131 my $object = Koha::Objects->next();
132
133 Returns the next object that is part of this set.
134 Returns undef if there are no more objects to return.
135
136 =cut
137
138 sub next {
139     my ( $self ) = @_;
140
141     my $result = $self->_resultset()->next();
142     return unless $result;
143
144     my $object = $self->object_class()->_new_from_dbic( $result );
145
146     return $object;
147 }
148
149 =head3 Koha::Objects->reset();
150
151 Koha::Objects->reset();
152
153 resets iteration so the next call to next() will start agein
154 with the first object in a set.
155
156 =cut
157
158 sub reset {
159     my ( $self ) = @_;
160
161     $self->_resultset()->reset();
162
163     return $self;
164 }
165
166 =head3 Koha::Objects->as_list();
167
168 Koha::Objects->as_list();
169
170 Returns an arrayref of the objects in this set.
171
172 =cut
173
174 sub as_list {
175     my ( $self ) = @_;
176
177     my @dbic_rows = $self->_resultset()->all();
178
179     my @objects = $self->_wrap(@dbic_rows);
180
181     return wantarray ? @objects : \@objects;
182 }
183
184 =head3 Koha::Objects->unblessed
185
186 Returns an unblessed representation of objects.
187
188 =cut
189
190 sub unblessed {
191     my ($self) = @_;
192
193     return [ map { $_->unblessed } $self->as_list ];
194 }
195
196 =head3 Koha::Objects->_wrap
197
198 wraps the DBIC object in a corresponding Koha object
199
200 =cut
201
202 sub _wrap {
203     my ( $self, @dbic_rows ) = @_;
204
205     my @objects = map { $self->object_class()->_new_from_dbic( $_ ) } @dbic_rows;
206
207     return @objects;
208 }
209
210 =head3 Koha::Objects->_resultset
211
212 Returns the internal resultset or creates it if undefined
213
214 =cut
215
216 sub _resultset {
217     my ($self) = @_;
218
219     if ( ref($self) ) {
220         $self->{_resultset} ||=
221           Koha::Database->new()->schema()->resultset( $self->type() );
222
223         return $self->{_resultset};
224     }
225     else {
226         return Koha::Database->new()->schema()->resultset( $self->type() );
227     }
228 }
229
230 =head3 type
231
232 The type method must be set for all child classes.
233 The value returned by it should be the DBIC resultset name.
234 For example, for holds, type should return 'Reserve'.
235
236 =cut
237
238 sub type { }
239
240 =head3 object_class
241
242 This method must be set for all child classes.
243 The value returned by it should be the name of the Koha
244 object class that is returned by this class.
245 For example, for holds, object_class should return 'Koha::Hold'.
246
247 =cut
248
249 sub object_class { }
250
251 sub DESTROY { }
252
253 =head1 AUTHOR
254
255 Kyle M Hall <kyle@bywatersolutions.com>
256
257 =cut
258
259 1;