
jmanningatalisa-jon.net
Aug 5, 2005, 8:09 PM
Post #1 of 1
(94 views)
Permalink
|
|
CDBI::Plain - workaround for failing classes.
|
|
(sorry for the previous dup - didn't realize I had already sent it) After looking at my CDBI problems long and hard, I came up with a workaround for the issues I was having. I suspect it points to the cause of the problems - I'd guess it's related to inheritance. Below, Obj::* refers to my non-Catalyst CDBI Object classes. Class that fails: (as per example 2 in CDBI::Plain) package MyApp::M::MyTable; use base qw[Catalyst::Model::CDBI::Plain MyApp::Obj::MyTable]; 1; Class that works: (Update the example to this?) package MyApp::M::MyTable; # swapped order of base classes use base qw[MyApp::Obj::MyTable Catalyst::Model::CDBI::Plain]; sub new { # Prevents Class::DBI->new from being called. Catalyst::Model::CDBI::Plain->new(@_); } 1; What I think is happening is that when a call is made to a method in my model class, the inheritance is followed (depth-first, left-to-right) as such: 1. MyApp::M::MyTable 2. -> Catalyst::Model::CDBI::Plain 3. -> -> Class::DBI (stuff I'm trying to override in MyTable) 4. -> -> Catalyst::Base 5. -> MyApp::Obj::MyTable (table, columns, has_a, etc) 6. -> -> MyApp::Obj::RootCDBI (connect) 7. -> -> -> Class::DBI (Where it usually falls in the inheritance) [...] So, any methods I override in Class:DBI in my Obj class are ignored, since Class::DBI is resolved first. I suspect this is the source of my missing metadata. Switching around the base classes fixes this, except for the call to new, which is manually redirected to Catalyst. Thoughts? If this can be verified, can the example be updated? ~J
|