# In my script my $dbh = DBI->connect(); my $id = 1; my $obj = Obj->new($dbh, $id); my $foo = $obj->foo; my $bar = $obj->bar; # In a nearby package package Obj; use constant PI => 3.14; use constant G => 9.81; my %foo_cache; my %bar_cache; sub new { my ($class, $dbh, $id) = @_; my $self = bless {}, $class; $self->{dbh} = $dbh; $self->{id} = $id; return $self; } sub dbh { my $self = shift; return $self->{dbh}; } sub id { my $self = shift; return $self->{id}; } sub foo { my $self = shift; my $id = $self->id; my $dbh = $self->dbh; unless ($self->{foo}) { # check if foo is in cache if (exists $foo_cache{$id}) { # return from cache $self->{foo} = $foo_cache{$id}; } else { $foo_cache{$id} = PI * query_foo_from_db_using($dbh, $id); $self->{foo} = $foo_cache{$id}; } } return $self->{foo}; } sub bar { my $self = shift; my $id = $self->id; my $dbh = $self->dbh; unless ($self->{bar}) { # check if bar is in cache if (exists $bar_cache{$id}) { # return from cache $self->{bar} = $bar_cache{$id}; } else { $bar_cache{$id} = G * query_bar_from_db_using($dbh, $id); $self->{bar} = $bar_cache{$id}; } } return $self->{bar}; } 1;