in reply to DESTROY problem

Yeah, that's why I write that as:
sub DESTROY { my $self = shift; ... do class specific stuff ... $self->SUPER::DESTROY if $self->can("SUPER::DESTROY"); }
But that doesn't help if you're doing MI. This does:
sub DESTROY { my $self = shift; .... foreach my $class (@ISA) { my $destroy = "${class}::DESTROY"; $self->$destroy if $self->can($destroy); } }
That will do the right thing, regardless how many (even 0) classes you're inheriting.

Replies are listed 'Best First'.
Re^2: DESTROY problem
by 7stud (Deacon) on Dec 31, 2010 at 22:47 UTC

    I am curious about something I noticed in your solution. How come you can save a method name as a string and use the variable containing the string to call the method, like this:

    use strict; use warnings; use 5.010; {package Cow; sub speak { say "Mooo."; } } my $meth_name = "speak"; Cow->$meth_name; --output:-- Mooo.

    but you can't use the string literal itself to call the method?

    Cow->"speak"; --output:-- String found where operator expected at C:\Users\Me\Documents\perl2.pl + line 13, near "->"speak"" (Missing operator before "speak"?) syntax error at C:\Users\Me\Documents\perl2.pl line 13, near "->"speak +"" Execution of C:\Users\Me\Documents\perl2.pl aborted due to compilation + errors.

      Here's something to ponder. Can you use a quoted string as a subroutine name? If you don't know, figure that out and then you will have your answer.

        Can you use a quoted string as a subroutine name?
        Yes.
        sub foo {say "Hello"} "foo"->(); __END__ Hello
        The reason you cannot use a quoted string, or a general expression, is the limited amount of tokes that can follow an arrow. Based on token on the right hand side of an arrow, it's decided at compile time what kind of dereference it is. Think about it, if it where delayed till run time,
        $arrayref->[1];
        the arrow would be a binary operator with two array references on either side.

        Note that this works:

        sub Foo::foo {say "Hello"}; bless [], "Foo"->${\"foo"}; __END__ Hello