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

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.

Replies are listed 'Best First'.
Re: Re: Re: if (UNIVERSAL::isa($r, ref $l))
by demerphq (Chancellor) on Jul 24, 2003 at 07:25 UTC

    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...
Re^3: if (UNIVERSAL::isa($r, ref $l))
by adrianh (Chancellor) on Jul 24, 2003 at 10:17 UTC
    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...