Hi Bill,

I'm replying because I didn't see you getting a response in a few days.

On Mon, 9 Apr 2012 17:04:38 +0800
Bill Moseley <mose...@hank.org> wrote:

> 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?
> 

Yes, pretty much. Maybe I would also make sure that ->host_list is sorted and
uniq’ed or otherwise mostly lacking silly permutations and variations that can
interfere with the caching.

Furthermore, what I normally like to do to implement singletons is create an
"environment" object that contains all the common data, and keep a reference to
it for every class in the system. This way, one can have more than one
environment in the program.

Regards,

        Shlomi Fish

-- 
-----------------------------------------------------------------
Shlomi Fish       http://www.shlomifish.org/
Chuck Norris/etc. Facts - http://www.shlomifish.org/humour/bits/facts/

“Interesting” has a negative correlation with “successful”.
    — Anno on Freenode's #perl

Please reply to list if it's a mailing list post - http://shlom.in/reply .

Reply via email to