I'm trying to create a subclass of the DBI class.  My goal is twofold:

 1) Override the connect method so that I can hide many of the details
    of connecting from the rest of my package, and

 2) Add a few extra "helper" methods.

I want to access my extra helper methods, plus all the standard DBI
methods.

My subclass has no data of its own, so I just wanted to use the normal
DBI handle as the object reference.

I did something like this:

  package My::DB;

  use strict;
  use vars qw(@ISA);

  use DBI;

  @ISA = qw(DBI);

  sub connect {
    my $self = shift;
    my $class = ref($self) || $self;

    #... figure connect info $data_source, $username, $password

    return $class->SUPER::connect($data_source, $username, $password);
  }


  sub MyMethod {
    my $this = shift;

    # ... do some stuff
  }

Now when I do this:

  $dbh = My::DB->connect();

it works, but this:

  $dbh->MyMethod();

fails with "Can't locate object method "MyMethod" via package My::DB at
...".  Can I not inherit from DBI?  I thought that the reference would
be for my class, if DBI uses the two-argument form of bless...  What am
I doing wrong here?

So, then I thought I'd try re-blessing it into my class, like this:

  sub connect {
    my $self = shift;
    my $class = ref($self) || $self;

    #... figure connect info $data_source, $username, $password

    my $this = $class->SUPER::connect($data_source, $username, $password);

    return bless($this, $class);
  }

Now I can get to $dbh->MyMethod(), but I can't get to any of the DBI
methods; for example $dbh->prepare() fails with:

  Can't locate auto/My/DB/prepare.al in @INC ...

I can't even get there using SUPER; this also fails:

  sub MyMethod {
    my $this = shift;

    # ... do some stuff

    return $this->SUPER::prepare(...); 
  }

Gives me:

  Can't locate auto/My/DB/SUPER/prepare.al in @INC ...

which seems strange to me.

Anyway, can anyone help me make a subclass of DBI that does what I want?
Do I have to write some kind of AUTOLOAD to do a delegator, as described
in Camel?  I was hoping that the @ISA thing would allow any method that
wasn't known in my class to be automatically looked for in my parent
classes... why doesn't that work?

Thanks!

-- 
-------------------------------------------------------------------------------
 Paul D. Smith <[EMAIL PROTECTED]>    HASMAT--HA Software Methods & Tools
 "Please remain calm...I may be mad, but I am a professional." --Mad Scientist
-------------------------------------------------------------------------------
   These are my opinions---Nortel Networks takes no responsibility for them.

Reply via email to