Beefy Boxes and Bandwidth Generously Provided by pair Networks
Syntactic Confectionery Delight

Why ref($proto) should be avoided

by jeffa (Bishop)
on Jul 17, 2002 at 06:10 UTC ( #182347=note: print w/replies, xml ) Need Help??

in reply to Re: (jeffa) 3Re: My first stab at OO perl...
in thread My first stab at OO perl...

You almost got me. :)

On page 103, TheDamian explains that calling a 'constructor' as an object method is a lazy way to copy an object, but observe what happens when you change an object's attributes at runtime and try to clone it:
use strict; use Clone qw(clone); my $foo = foo->new(); $foo->{spam} = {spam =>'eggs'}; my $bad_clone = $foo->new(); my $good_clone = clone($foo); $bad_clone->{spam}->{spam} or warn "bad has no eggs"; $good_clone->{spam}->{spam} or warn "good has no eggs"; package foo; use strict; sub new { my $class = shift; my $proto = ref($class) || $class; return bless {}, $proto; }
TheDamian also explains on page 105 that
While many experts view the overloading of constructors as object copiers to be a natural extension of their functionality, others consider the technique unintuitive, too subtle, and more likely to produce obscure and hard-to-maintain code.
and on page 106
If you have a choice, it's probably better to code a seperate clone method. Apart from keeping your individual methods simpler and less prone to bugs, the method's name will force client code to be more clearly self-documenting.


doesn't like spam

Replies are listed 'Best First'.
Re: Why ref($proto) should be avoided
by frag (Hermit) on Jul 17, 2002 at 11:30 UTC
    Still, that's after using ref($caller) in all the preceding examples. Ditto in the 'final version' of CD::Music (p.114). And you've got to admit, "probably better" aint much of a condemnation.

    -- Frag.

      Well, i wouldn't say all the preceding examples. He does use some form of ref($caller) extensively throughout the book, but not in every example.

      And i can admit that "probably better" ain't much of condemnation, but not as much as i can admit that it ain't much of a recomendation either. I see nothing wrong with simpler methods that are less prone to bugs and are more clearly self-documenting. :)

      Update: i should mention that Class::MethodMaker's new_hash_init specifier makes for a very robust instance constructor. Consider using it if you don't like having to write your own clone method.


      (the triplet paradiddle with high-hat)

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://182347]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others surveying the Monastery: (3)
As of 2021-05-08 05:49 GMT
Find Nodes?
    Voting Booth?
    Perl 7 will be out ...

    Results (96 votes). Check out past polls.