On Mon, Sep 18, 2000 at 05:49:28AM -0000, Perl6 RFC Librarian wrote:
> Here's where the problem lies.  Even though we now have a subclass
> of Frog, the Forest class is still referencing the original Frog
> class and not Frog::Japanese.

The DBI has this very problem!  DBI->connect() returns DBI::db
objects, DBI->prepare() returns DBI::st.  If you want to override the
behavior for statement handles and connections, its not enough to just
subclass DBI::st and DBI::db, you must also subclass DBI and override
connect() and prepare() (and hope DBI doesn't use DBI::st or DBI::db
anywhere else.)

DBI->init_rootclass() is a fairly hairy workaround to this problem.
It works like this:

    package Ima::DBI::db;
    @ISA = qw(DBI::db);

    package Ima::DBI::st;
    @ISA = qw(DBI::st);

    package Ima::DBI;

    use base qw(DBI);
    Ima::DBI->init_rootclass;

    # $dbh is an Ima::DBI::db object, $sth is an Ima::DBI::st
    $dbh = Ima::DBI->connect(...);
    $sth = $dbh->prepare(...);

Ima::DBI->init_rootclass() informs the DBI that Ima::DBI is a subclass
and that Ima::DBI::db and Ima::DBI::st objects should be used.  It
does this by just appending '::db' onto the classname, which means the
names of the classes are fixed.  A Bad Thing.

[From DBI->connect()]

    # XXX this is inelegant but practical in the short term, sigh.
    if ($installed_rootclass{$class}) {
        $dbh->{RootClass} = $class;
        bless $dbh => $class.'::db';
        my ($outer, $inner) = DBI::_handles($dbh);
        bless $inner => $class.'::db';
    }

It works, but to quote Tim Bunce there... *sigh*.


So anyhow, yes, this is a big, icky problem.


-- 

Michael G Schwern      http://www.pobox.com/~schwern/      [EMAIL PROTECTED]
Just Another Stupid Consultant                      Perl6 Kwalitee Ashuranse
<mendel>         ScHWeRnsChweRN    sChWErN   SchweRN  SCHWErNSChwERnsCHwERN  
    sChWErn  ScHWeRn      schweRn           sCHWErN           schWeRn   
scHWeRN     SchWeRN      scHWErn SchwErn       scHWErn       ScHweRN      
sChwern       scHWerN        scHWeRn           scHWerN        ScHwerN      
SChWeRN scHWeRn           SchwERNschwERn        SCHwern  sCHWErN   SCHWErN   
       sChWeRn 

Reply via email to