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.
jeffa
doesn't like spam