[Dbix-class] Overriding Standard Methods

Dave Cross dave at dave.org.uk
Wed Dec 3 16:06:49 GMT 2008


michael reddick wrote:
> On Wed, Dec 3, 2008 at 9:19 AM, Dave Cross <dave at dave.org.uk> wrote:
> 
>> I think I'm missing something obvious here. Feel free to point out my
>> stupidity.
>>
>> I have a set of DBIC classes that have been generated by Schema::Loader.
>> I want to overload the "delete" method so that instead of actually
>> deleting the row the deleted flag gets set to true[1].
>>
>> I can add a method to the class like this:
>>
>> sub rm {
>>  my $self = shift;
>>
>>  $self->deleted(1);
>>  $self->update;
>> }
>>
>> and call "rm" instead of "delete". Then everything works. But I don't
>> want to call the method "rm", I want to call it "delete". If I call it
>> delete, then my method doesn't get called. It goes into
>> DBIx::Class::Relationship::CascadeActions::delete and that passes
>> control to DBIx::Class::Row::delete - completely missing my method.
>>
>> What am I missing?
>>
>> Cheers,
>>
>> Dave...
>>
>> [1] Yes, this should be a trigger. But triggers are banned from this
>> database.
> 
> 
> Looks like you need a override delete in a component
> 
> http://search.cpan.org/~ash/DBIx-Class-0.08010/lib/DBIx/Class/Manual/Component.pod

Yes, I'd been reading that. And trying the "Class::C3::calculateMRO"
hack shows me exactly where the problem is. My original class is first
in the list so any methods there get called without any problem. But the
base class is last in the list so any methods there only get called if
they don't exist anywhere in the stack of DBIx::Class classes that are
higher in the list.

So I can either write a component or hack around with the Class::C3
inheritance list.

Decisions, decisions :)

Dave...



More information about the DBIx-Class mailing list