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

You can use your constructor for creation a new object and define its properties by default (include getting dbh, because I think you will store new tickets in the database):
our $properties = { time => undef, trad_ref => undef, adr_buyer_bank => 'test', adr_seller_bank => undef, seller_pays => undef, }; sub new { my $class = shift; my $self = {}; map { $self->{$_} = $properties->{$_} } keys %$properties; bless $self, $class; $self->_init(@_); return $self; } sub _init { my $self = shift; if(@_) { my %args = @_; map { $self->{$_} = $args{$_} if exists $self->{$_} } keys %ar +gs; } $self->{__dbh} = DBI->connection(...) unless defined $self->{__dbh +}; } sub load { my $self = shift; 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; $self->_init(%$row); return 1; }
Use its in the script or another module:
my $ticket = MyApp::Ticket->new();
or using input parameters:
my $ticket = MyApp::Ticket->new(time => time(), trad_ref => 34567, adr_buyer_bank => 'blah', adr_seller_bank => 'blah, seller_pays => 99.99);
For load existing ticket use method load, as you wrote:
my $ticket = MyApp::Ticket->new(); my $res = $ticket->load(12345);
It's just rough but idea is you need only one constructor and others are methods. Of course, I didn't implement errors catch but it's another story.
      
--------------------------------
SV* sv_bless(SV* sv, HV* stash);