in reply to if (UNIVERSAL::isa($r, ref $l))

Id agree with the other posters that using __PACKAGE__ is the best approach. Im actually a little suprised that davorg did this. I have a feeling its either shorthand for a class not meant to be inherited, or it was modified by an unthinking editor to reduce space in the column. Hopefully he will be by soon and let us know.


---
demerphq

<Elian> And I do take a kind of perverse pleasure in having an OO assembly language...

Replies are listed 'Best First'.
Re: Re: if (UNIVERSAL::isa($r, ref $l))
by hossman (Prior) on Jul 24, 2003 at 01:09 UTC
    ...or it was modified by an unthinking editor to reduce space in the column. Hopefully he will be by soon and let us know.
    Well, It's in version 1.02 of the package.
Re: Re: if (UNIVERSAL::isa($r, ref $l))
by chromatic (Archbishop) on Jul 24, 2003 at 05:07 UTC

    Hey, I edited that.

    I really don't see what advantage __PACKAGE__ has over a hardcoded class name except that it's Pythonesquely uglier.

    Alright, I can hear dozens of keyboards getting ready to type "What about inheritance, you dope?" Before you get excited, try this little program:

    package Foo; sub new { bless {}, __PACKAGE__; } package Bar; use vars qw( @ISA ); @ISA = 'Foo'; package main; my $bar = Bar->new(); print "Bar is a ", ref $bar, "\n";

    Yep, the package into which it's compiled. Nope, not all that useful. Pity.

    Update: Okay, if you don't like hardcoding the class name, there's an advantage. The Class module gets rid of the ugliness. That's kinda useful.

      You edited it did you? I see, shame on you. ;-)

      I really don't see what advantage __PACKAGE__ has over a hardcoded class name except that it's Pythonesquely uglier.

      The advantage is that using __PACKAGE__ works, whereas as written it fails the empty subclass test because of the ref $l thing

      use Number::Fraction; package Number::Fraction::Foo; use base qw/Number::Fraction/; 1; package Number::Fraction::Bar; use base qw/Number::Fraction/; 1; my $n=Number::Fraction->new(1,4); my $f=Number::Fraction::Foo->new(1,4); my $b=Number::Fraction::Bar->new(1,4); print $n+$f,$/; print $n+$b,$/; print $f+$n,$/; print $b+$n,$/; print $f+$b,$/; print $b+$f,$/; __END__ Can't add a Number::Fraction::Foo to a Number::Fraction::Foo at D:\per +l\devlib\/Number/Fraction.pm line 119 Number::Fraction::add('1/4', '1/4', '') called at D:\Temp\nf.pl li +ne 15 1/2 1/2

      If you change all the ref $l's to __PACKAGE__ (As I did to create Number::FractionP) you get the expected results:

      use Number::FractionP; package Number::FractionP::Foo; use base qw/Number::FractionP/; 1; package Number::FractionP::Bar; use base qw/Number::FractionP/; 1; my $n=Number::FractionP->new(1,4); my $f=Number::FractionP::Foo->new(1,4); my $b=Number::FractionP::Bar->new(1,4); print $n+$f,$/; print $n+$b,$/; print $f+$n,$/; print $b+$n,$/; print $f+$b,$/; print $b+$f,$/; __END__ 1/2 1/2 1/2 1/2 1/2 1/2

      So I'd say that ugliness has to take back seat to correctness. Pity.

      :-)


      ---
      demerphq

      <Elian> And I do take a kind of perverse pleasure in having an OO assembly language...
      I really don't see what advantage __PACKAGE__ has over a hardcoded class name except that it's Pythonesquely uglier.

      I prefer __PACKAGE__ (or CLASS) because I like to say the class name once and only once in the module source (you should know why that's a good motto to live by :-).

      That way I don't have to worry about grepping the module source if I change the name of the module.

        That way I don't have to worry about grepping the module source if I change the name of the module.

        You don't put the name of the module in the Pod? ;-)


        ---
        demerphq

        <Elian> And I do take a kind of perverse pleasure in having an OO assembly language...
Re: Re: if (UNIVERSAL::isa($r, ref $l))
by davorg (Chancellor) on Jul 24, 2003 at 07:14 UTC
    Hopefully he will be by soon and let us know.

    It's a bug in my code :)

    --
    <http://www.dave.org.uk>

    "The first rule of Perl club is you do not talk about Perl club."
    -- Chip Salzenberg

      At the bare minimum I would say you could make a nice follow up article or whatnot out of this. :-)

      Nice article BTW, a very good explanation of some of the darker corners of overload.


      ---
      demerphq

      <Elian> And I do take a kind of perverse pleasure in having an OO assembly language...

      I reckon the moral of this story for us all is that to properly test the inheritance of an overloaded module is that you need to to do a double empty subclass test and test them all against each other. (A methodology that could actually be easily automated if somebody wants to write a Test::Overload module.)


      ---
      demerphq

      <Elian> And I do take a kind of perverse pleasure in having an OO assembly language...