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
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.
|