We have an in-house storage "backend" we use for a number of purposes.  We
can pretend it's something like memcached that is configured with host
names.  I have a role for working with this backend which is consumed by a
number of more specific classes.  For example, each specific class handles
decoding and encoding the stored data.

Often a given application will use a number of these specific classes.  I
want to use a shared connection in this case.  So, instead of a singleton
backend class, I want a singleton cached by the config (by the hosts in
this example).


my $foo_store = My::Store::Foo->new( { hosts => \@hosts } );
my $bar_store = My::Store::Bar->new( { hosts => \@hosts } );


So, $foo_store->backend_connection = $foo_store->backend_connection because
@hosts are the same in both.


What I've been doing is something like this in my role:

has backend_connection => ( builder => _build_connection );


my %cached_connections;

sub _build_connection {
    my $self = shift;
    return $cached_connection{ $self->connection_key } ||=
$self->new_connection;
}

sub connection_key { return join ':', shift->host_list }


Does this seem like a reasonable approach?

-- 
Bill Moseley
mose...@hank.org

Reply via email to