package UserDBConn; sub new { my ($class, $param1, $param2 ...) = @_; my $this = bless({}, $class); # store the returned DB handle in a private slot $this->{_db} = DBI->connect($param1, $param2 ...); } sub getDBHandle { return $_[0]->{_db}; } package User; # lexically scoped at file level so you can create multiple # instances of this module within this process using the # same UserDBConn. Creating a new DB connection each time # you want to pull out a user's information would be *bad*. my $user_db_conn; # = new UserDBConn(...); sub new { my ($class, $username, $more_stuff) = @_; my $this = bless({}, $class); $user_db_conn ||= new UserDBConn(...); # now use $user_db_con->getDBHandle() to populate $this } sub setX {} sub getX {} sub save { # write all our data to the table }