Bug 13069 - (follow-up) Enable sort by title to ignore articles
[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     my $object = $self->object_class()->_new_from_dbic( $result );
88
89     return $object;
90 }
91
92 =head3 Koha::Objects->search();
93
94 my @objects = Koha::Objects->search($params);
95
96 =cut
97
98 sub search {
99     my ( $self, $params, $attributes ) = @_;
100
101     if (wantarray) {
102         my @dbic_rows = $self->_resultset()->search($params, $attributes);
103
104         return $self->_wrap(@dbic_rows);
105
106     }
107     else {
108         my $class = ref($self) ? ref($self) : $self;
109         my $rs = $self->_resultset()->search($params, $attributes);
110
111         return $class->_new_from_dbic($rs);
112     }
113 }
114
115 =head3 Koha::Objects->count();
116
117 my @objects = Koha::Objects->count($params);
118
119 =cut
120
121 sub count {
122     my ( $self, $params ) = @_;
123
124     return $self->_resultset()->count($params);
125 }
126
127 =head3 Koha::Objects->next();
128
129 my $object = Koha::Objects->next();
130
131 Returns the next object that is part of this set.
132 Returns undef if there are no more objects to return.
133
134 =cut
135
136 sub next {
137     my ( $self ) = @_;
138
139     my $result = $self->_resultset()->next();
140     return unless $result;
141
142     my $object = $self->object_class()->_new_from_dbic( $result );
143
144     return $object;
145 }
146
147 =head3 Koha::Objects->reset();
148
149 Koha::Objects->reset();
150
151 resets iteration so the next call to next() will start agein
152 with the first object in a set.
153
154 =cut
155
156 sub reset {
157     my ( $self ) = @_;
158
159     $self->_resultset()->reset();
160
161     return $self;
162 }
163
164 =head3 Koha::Objects->as_list();
165
166 Koha::Objects->as_list();
167
168 Returns an arrayref of the objects in this set.
169
170 =cut
171
172 sub as_list {
173     my ( $self ) = @_;
174
175     my @dbic_rows = $self->_resultset()->all();
176
177     my @objects = $self->_wrap(@dbic_rows);
178
179     return wantarray ? @objects : \@objects;
180 }
181
182 =head3 Koha::Objects->_wrap
183
184 wraps the DBIC object in a corresponding Koha object
185
186 =cut
187
188 sub _wrap {
189     my ( $self, @dbic_rows ) = @_;
190
191     my @objects = map { $self->object_class()->_new_from_dbic( $_ ) } @dbic_rows;
192
193     return @objects;
194 }
195
196 =head3 Koha::Objects->_resultset
197
198 Returns the internal resultset or creates it if undefined
199
200 =cut
201
202 sub _resultset {
203     my ($self) = @_;
204
205     if ( ref($self) ) {
206         $self->{_resultset} ||=
207           Koha::Database->new()->schema()->resultset( $self->type() );
208
209         return $self->{_resultset};
210     }
211     else {
212         return Koha::Database->new()->schema()->resultset( $self->type() );
213     }
214 }
215
216 =head3 type
217
218 The type method must be set for all child classes.
219 The value returned by it should be the DBIC resultset name.
220 For example, for holds, type should return 'Reserve'.
221
222 =cut
223
224 sub type { }
225
226 =head3 object_class
227
228 This method must be set for all child classes.
229 The value returned by it should be the name of the Koha
230 object class that is returned by this class.
231 For example, for holds, object_class should return 'Koha::Hold'.
232
233 =cut
234
235 sub object_class { }
236
237 sub DESTROY { }
238
239 =head1 AUTHOR
240
241 Kyle M Hall <kyle@bywatersolutions.com>
242
243 =cut
244
245 1;