The problem has nothing to do with SQL-OOP mapping; it's just general OOP. In the end, if you override create
and another Class::DBI method (such as find_or_create
) calls $self->create
, it is perfectly natural that it will call your overriden method. That's what polymorphism is all about.
Think about it the other way: if it worked the way you want, someone would soon complain that they overrode create and called find_or_create expecting it to call their overriden create, but it didn't.
If you create an infinite loop or somesuch thing by overriding create, you should reconsider your strategy. You can either override find_or_create as well, or hack your method to keep state so that it breaks out of the loop.