3 # Copyright ByWater Solutions 2014
5 # This file is part of Koha.
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
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.
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.
23 use Encode qw{encode};
29 Koha::Object - Koha Object base class
34 my $object = Koha::Object->new({ property1 => $property1, property2 => $property2, etc... } );
38 This class must always be subclassed.
46 =head3 Koha::Object->new();
48 my $object = Koha::Object->new();
49 my $object = Koha::Object->new($attributes);
51 Note that this cannot be used to retrieve record from the DB.
56 my ( $class, $attributes ) = @_;
61 Koha::Database->new()->schema()->resultset( $class->type() )
65 croak("No type found! Koha::Object must be subclassed!")
66 unless $class->type();
68 bless( $self, $class );
72 =head3 Koha::Object->new_from_dbic();
74 my $object = Koha::Object->new_from_dbic($dbic_row);
79 my ( $class, $dbic_row ) = @_;
83 $self->{_result} = $dbic_row;
85 croak("No type found! Koha::Object must be subclassed!")
86 unless $class->type();
88 croak( "DBIC result type " . ref( $self->{_result} ) . " isn't of the type " . $class->type() )
89 unless ref( $self->{_result} ) eq "Koha::Schema::Result::" . $class->type();
91 bless( $self, $class );
95 =head3 $object->store();
97 Saves the object in storage.
98 If the object is new, it will be created.
99 If the object previously existed, it will be updated.
102 1 if the store was a success
103 0 if the store failed
110 return $self->_result()->update_or_insert() ? 1 : 0;
113 =head3 $object->in_storage();
115 Returns true if the object has been previously stored.
122 return $self->_result()->in_storage();
125 =head3 $object->is_changed();
127 Returns true if the object has properties that are different from
128 the properties of the object in storage.
133 my ( $self, @columns ) = @_;
135 return $self->_result()->is_changed(@columns);
138 =head3 $object->delete();
140 Removes the object from storage.
143 1 if the deletion was a success
144 0 if the deletion failed
145 -1 if the object was never in storage
152 # Deleting something not in storage thows an exception
153 return -1 unless $self->_result()->in_storage();
155 # Return a boolean for succcess
156 return $self->_result()->delete() ? 1 : 0;
159 =head3 $object->set( $properties_hashref )
163 property1 => $property1,
164 property2 => $property2,
165 property3 => $propery3,
169 Enables multiple properties to be set at once
172 1 if all properties were set.
173 0 if one or more properties do not exist.
174 undef if all properties exist but a different error
175 prevents one or more properties from being set.
177 If one or more of the properties do not exist,
178 no properties will be set.
183 my ( $self, $properties ) = @_;
185 my @columns = @{$self->_columns()};
187 foreach my $p ( keys %$properties ) {
188 unless ( grep {/^$p$/} @columns ) {
189 carp("No property $p!");
194 return $self->_result()->set_columns($properties) ? 1 : undef;
197 =head3 $object->id();
199 Returns the id of the object if it has one.
206 my ( $id ) = $self->_result()->id();
211 =head3 $object->_result();
213 Returns the internal DBIC Row object
220 # If we don't have a dbic row at this point, we need to create an empty one
222 Koha::Database->new()->schema()->resultset( $self->type() )->new({});
224 return $self->{_result};
227 =head3 $object->_columns();
229 Returns an arrayref of the table columns
236 # If we don't have a dbic row at this point, we need to create an empty one
237 $self->{_columns} ||= [ $self->_result()->result_source()->columns() ];
239 return $self->{_columns};
245 The autoload method is used only to get and set values for an objects properties.
252 my $method = our $AUTOLOAD;
255 my @columns = @{$self->_columns()};
256 # Using direct setter/getter like $item->barcode() or $item->barcode($barcode);
257 if ( grep {/^$method$/} @columns ) {
259 return $self->_result()->set_column( $method, @_ );
261 my $value = $self->_result()->get_column( $method );
262 return encode( 'UTF-8', $value );
266 carp "No method $method!";
272 This method must be defined in the child class. The value is the name of the DBIC resultset.
273 For example, for borrowers, the type method will return "Borrower".
283 Kyle M Hall <kyle@bywatersolutions.com>