Here's how I like to do this:
I prefer keeping one bless in my module. I don't like having to check multiple places in the module for the blessing. I've had some headaches because of that.
I also like to think that most my modules 'use' or 'contain' a database handle. So my modules don't inherit from DBI. Instead, I opt for a the some sort of singleton factory to get a
$dbh instance. There are plenty of ways to do this,
here's one that I've been using.
HTH
package MyApp::Ticket;
use strict;
sub new
{
my ($class,%args) = @_;
my $self = bless {};
if ( $args{ticket_number} )
{
$self->load( $args{ticket_number} );
}
else
{
$self->init(%args);
}
return $self;
}
sub init
{
my ($self,%args) = @_;
$$self{_time} => $args{'time'};
$$self{_trade_ref} => $args{'trade_ref'};
$$self{_adr_buyer_bank} => $args{'adr_buyer_bank'};
$$self{_adr_seller_bank} => $args{'adr_seller_bank'};
$$self{_ti_seller_pays} => $args{'seller_pays'};
return $self;
}
sub load
{
my $self = shift;
my $ticket_number = shift;
#
# pull the $dbh from some shared location
# like a singleton factory
#
my $dbh = GetDBH();
my $sql = "SELECT * FROM tickets WHERE id = ?";
my $sth = $dbh->prepare($sql) or die $dbh->errstr;
$sth->execute($ticket_number);
my $row = $sth->fetchrow_hashref;
return $self->init($$row);
}
#
# and then initialize tickets like so:
#
my $new_ticket = new MyApp::Ticket(
time=>time(),trad_ref=>34567,
adr_buyer_bank => 'blah',
adr_seller_bank =>'blah,
seller_pays => 99.99
);
my $new_ticket = new MyApp::Ticket( ticket_number => 12345 );