=head1 NAME
DBIx::SQLEngine::Record::Extras - Provide extra methods
=head1 SYNOPSIS
package My::Record;
use DBIx::SQLEngine::Record::Class '-isasubclass', 'Extras';
my $sqldb = DBIx::SQLEngine->new( ... );
My::Record->table( $sqldb->table( 'foo' ) );
=head1 DESCRIPTION
This package provides a multiply-composable collection of functionality for Record classes.
Don't use this module directly; instead, pass its name as a trait when you create a new record class. This package provides a multiply-composable collection of functionality for Record classes. It is combined with the base class and other traits by DBIx::SQLEngine::Record::Class.
=cut
########################################################################
package DBIx::SQLEngine::Record::Extras;
use strict;
use Carp;
########################################################################
=head1 REFERENCE
=cut
########################################################################
sub demand_table { (shift)->get_table() }
sub datasource { (shift)->get_table()->sql_engine() }
sub do_sql { (shift)->get_table()->sql_engine()->do_sql( @_ ) }
########################################################################
=head2 Selecting Records
=over 4
=item fetch_records
$recordset = My::Students->fetch_records( criteria => {status=>'active'} );
Fetch all matching records and return them in a RecordSet.
=item fetch_one
$dave = My::Students->fetch_one( criteria => { name => 'Dave' } );
Fetch a single matching record.
=item fetch_id
$prisoner = My::Students->fetch_id( 6 );
Fetch a single record based on its primary key.
=item visit_records
@results = My::Students->visit_records( \&mysub, criteria=> ... );
Calls the provided subroutine on each matching record as it is retrieved. Returns the accumulated results of each subroutine call (in list context).
=item refetch_record
$record->refetch_record();
Re-retrieve the values for this record from the database based on its primary key.
=back
=cut
sub new { (shift)->new_with_values( @_ ) }
########################################################################
sub fetch_records { (shift)->fetch_select( @_ ) }
sub visit_records { (shift)->visit_select( @_ ) }
sub fetch_sql { (shift)->fetch_select( sql => [ @_ ] ) }
sub fetch_id { (shift)->select_record( @_ ) }
sub fetch {
(shift)->fetch_select(
( ref $_[0] or ! defined $_[0] ) ? (where=>$_[0], order=>$_[1])
: @_
);
}
sub fetch_one {
my $self = shift;
my $records = $self->fetch( @_ );
( scalar @$records < 2 ) or
carp "Multiple matches for fetch_one: " . join(', ', map "'$_'", @_ );
$records->[0];
}
sub refetch_record {
my $self = shift();
my $db_row = $self->get_table()->select_row( $self )
or confess;
%$self = %$db_row;
$self->post_fetch;
$self;
}
########################################################################
sub change { (shift)->change_values() }
########################################################################
sub save_row { (shift)->save_record(@_) }
sub insert_row { (shift)->insert_record( @_ ) }
sub update_row { (shift)->update_record( @_ ) }
sub delete_row { (shift)->delete_record( @_ ) }
########################################################################
1;