[Dbix-class] Overriding Standard Methods

Dave Cross dave at dave.org.uk
Wed Dec 3 15:41:33 GMT 2008


John Goulah wrote:
> On Wed, Dec 3, 2008 at 10: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.
> 
> This should work:
> 
> sub delete {
>      my $self = shift;
>      # do stuff
>      return $self->next::method(@_);
> }

Thanks for the advice, but it doesn't seem to fix anything. And, looking
at it, I don't see how it could. If my delete method isn't being called,
then how can adding code to it fix the problem?

Actually, my problem is slightly more complex. I want to put the delete
method in a base class that all of my classes inherit from. Some of
these classes have a deleted flag and others don't. So my code should
really look like this:

sub delete {
    my $self = shift;

    if ($self->can(deleted)) {
         $self->deleted(1);
         $self->update;
    } else {
         $self->SUPER::delete;
    }
}

And because of the C3 stuff, that SUPER:: also probably needs to be
replaced with some next::method magic.

But getting the method to be called is the first problem :)

Dave...



More information about the DBIx-Class mailing list