On Feb 4, 2005, at 2:08 AM, Tim Bunce wrote:
One way I'd had in the back of my mind way to use the DBI dispatcher to fire the callbacks.
$h->{Callbacks}->{$method_name} = \&foo; # called on entry
$h->{Callbacks}->{$method_name} = [ \&foo, \&bar ]; # foo on entry, bar on exit
$h->{Callbacks}->{$method_name} = [ [EMAIL PROTECTED], \&bar ]; # each of @subrefs on entry, bar on exit
that way _every_ method would get pre and post call hooks for free. If a handle has no callbacks the cost would be unmeasurable (just a bit flag test in the dispatcher). If a handle has any callbacks then the added cost for calling a method that doesn't have a callback would just be one hash lookup.
Ah, yes, that sounds really nice.
How's your C coding? :)
I gave up when I got to my first malloc. Sorry, I'm JAPH. I can help with the Perl code, though!
This approach doesn't directly support callbacks that need to fire _within_ a method, such as the proposed OnConnectCached firing only if connect_cached() does _not_ need to call connect().
[For that case you could have an pre-connect_cached callback that temporarily installs a connect callback which sets a flag, and a post-connect_cached callback that resets %$attr if the flag's not set. But that's getting quite baroque!]
Yah, my NoReset solution is starting to look better. Maybe the get_child() stuff should take priority?
Alternatively connect_cached() could call a new method in that situation and the hooks could be applied to that. But that's relatively expensive and it would be 'odd' for that method to be called with the $attr that was passed to connect_cached().
Alternatively some pseudo-method-names could be supported in the $h->{Callbacks} hash (ie "connect_cached.reused") and the relevant methods could check for and call them directly. Then the extra code in connect_cached would something like this:
if (my $cb = $dbh->{Callbacks}) { my $oc = $cb->{"connect_cached.reused"}; $oc->($dbh, $dsn, $user, $pass, $attr) if ref $oc eq 'CODE'; }
Umm, food for thought...
That's starting to get might complex, isn't it?
Regards,
David
smime.p7s
Description: S/MIME cryptographic signature