sub install_method {
# special class method called directly by apps and/or drivers
# to install new methods into the DBI dispatcher
# DBD::Foo::db->install_method("foo_mumble", { usage => [...], options => '...' });
my ($class, $method, $attr) = @_;
Carp::croak("Class '$class' must begin with DBD:: and end with ::db or ::st")
unless $class =~ /^DBD::(\w+)::(dr|db|st)$/;
my ($driver, $subtype) = ($1, $2);
Carp::croak("invalid method name '$method'")
unless $method =~ m/^([a-z][a-z0-9]*_)\w+$/;
my $prefix = $1;
my $reg_info = $dbd_prefix_registry->{$prefix};
Carp::carp("method name prefix '$prefix' is not associated with a registered driver") unless $reg_info;
my $full_method = "DBI::${subtype}::$method";
$DBI::installed_methods{$full_method} = $attr;
my (undef, $filename, $line) = caller;
# XXX reformat $attr as needed for _install_method
my %attr = %{$attr||{}}; # copy so we can edit
DBI->_install_method("DBI::${subtype}::$method", "$filename at line $line", \%attr); # Line causing the redefine
}
####
sub install_method {
# special class method called directly by apps and/or drivers
# to install new methods into the DBI dispatcher
# DBD::Foo::db->install_method("foo_mumble", { usage => [...], options => '...' });
my ($class, $method, $attr) = @_;
Carp::croak("Class '$class' must begin with DBD:: and end with ::db or ::st")
unless $class =~ /^DBD::(\w+)::(dr|db|st)$/;
my ($driver, $subtype) = ($1, $2);
Carp::croak("invalid method name '$method'")
unless $method =~ m/^([a-z][a-z0-9]*_)\w+$/;
my $prefix = $1;
my $reg_info = $dbd_prefix_registry->{$prefix};
Carp::carp("method name prefix '$prefix' is not associated with a registered driver") unless $reg_info;
my $full_method = "DBI::${subtype}::$method";
$DBI::installed_methods{$full_method} = $attr;
my (undef, $filename, $line) = caller;
# XXX reformat $attr as needed for _install_method
my %attr = %{$attr||{}}; # copy so we can edit
DBI->_install_method("DBI::${subtype}::$method", "$filename at line $line", \%attr);
}