Right, that's the thing; I have code that's essentially just like that all over the damn place. I'm trying to refactor/clean it up right now. | [reply] |
sub build_lazy
{
my ($var, $callback, @params) = @_;
eval <<__EVAL__;
{
my \$$var;
sub $var {
\\\$var = $callback->(@params) unless defined \$$var;
\$$var;
};
}
__EVAL__
}
# Later ...
build_lazy( 'dbh', \&build_dbh, @dbh_params );
build_lazy( 'foo', \&build_foo );
Of course, you might want some dwimmery for hashes vs. arrays vs. scalars, unless you're ok with everything as a reference. I would be, but that's just me. And, you might want to throw BEGIN or CHECK around the calls to build_lazy(), but that's probably overkill.
------
We are the carpenters and bricklayers of the Information Age.
Then there are Damian modules.... *sigh* ... that's not about being less-lazy -- that's about being on some really good drugs -- you know, there is no spoon. - flyingmoose
I shouldn't have to say this, but any code, unless otherwise stated, is untested
| [reply] [d/l] |
use strict;
sub build_lazy {
my ($name, $callback, @params) = @_;
my $var;
no strict 'refs';
*$name = sub {
$var = $callback->(@params) unless defined $var;
$var;
};
}
build_lazy( 'dbh', sub { print @_ }, 'hi');
print dbh(), dbh(); # hi11
Its not that I don't like this approach (its still a hell of a lot better than what I have now), I just feel that... I don't know, just that its not the be can be done. Then again, I guess I have a weird mental condition where I'm unsatisfied with my code unless it takes on *exactly* the form thats in my mind, and I become uncomfortable when it isn't. I'm kind of weird. Thanks for the idea though.
| [reply] [d/l] |
I really like dbh() because it gives you a runtime chance to automatically reconnect or refresh or whatever as needed which you wouldn't get if you just accessed a global $DBH.
| [reply] |
Yeah, my little class in the root node would do the same thing, since it just checks for definedness. I just want a pretty tied interface to it. I guess I'll just write my own class, and maybe make it general enough for CPAN...
| [reply] |