in reply to how do i implement alternate constructors for an object

I'd opt for polymorphic constructors. You're initializing the same fields two different ways, from two different sources. Let your constructor examine the object being passed in; if it's a database handle, use that, and if not, see if it has the fields you want.

Here's a simple sketch:

package MyApp::Ticket; sub new { my ($class, $from, $extra) = @_; if (UNIVERSAL::isa($from, 'DBI')) # it's a DB handle { my $sth = $from->prepare(...); $sth->execute($extra); # and so on } else { $self->{_time} = $from->{time}; # etc. } bless $self, $class; } # Called like so: my $dbh = DBI->connect(...); my $dbticket = MyApp::Ticket->new($dbh, $ticketno); # or like so: my %args; my $ticket = MyApp::Ticket->new(\%args);
HTH

Update
Better to use isa() instead of can().