Actually, looking at this again, I'm pretty sure it's right: neither
DBIx::Class::Storage::DBI::Sybase::MSSQL nor its parent classes
override _execute.

NoBindVars does its work in _prep_for_execute, so I'd expect that a
->can on that would refer there.

>>
I found the problem, but I don't know what the solution is.

The problem is in the multiple inheritance of Sybase::MSSQL:

use base qw/DBIx::Class::Storage::DBI::MSSQL
DBIx::Class::Storage::DBI::Sybase/;

When _execute is called (which is what NoBindVars overrides) Perl looks
first in DBI::MSSQL.  Having no luck there, Perl goes *up* a level to DBI
finds the method and stops.  (Thanks to Conway's "Object Oriented Perl" for
pointing this out.  He says it's "left-most ancestor wins".)

If you swap the class names in the use statement:

use base qw/DBIx::Class::Storage::DBI::Sybase
DBIx::Class::Storage::DBI::MSSQL/;

Then the correct _execute is found.  However, you now get the wrong version
of last_insert_id and build_datetime_parser (methods overridden by
DBI::MSSQL).
 
So now the question is: how do you do multiple inheritance in Perl such that
both parent classes can override the grandparent?

- Alan


_______________________________________________
List: http://lists.rawmode.org/cgi-bin/mailman/listinfo/dbix-class
Wiki: http://dbix-class.shadowcatsystems.co.uk/
IRC: irc.perl.org#dbix-class
SVN: http://dev.catalyst.perl.org/repos/bast/trunk/DBIx-Class/
Searchable Archive: http://www.mail-archive.com/[email protected]/

Reply via email to