NAME
Perl::Critic::Policy::Bangs::ProhibitRefProtoOrProto
DESCRIPTION
Many times you'll see code for object constructors that's been cut-and-pasted from somewhere else, and it looks like this:
sub new {
my $proto = shift;
my $class = ref($proto) || $proto;
my $self = bless {}, $class;
...
}
The $class
is derived from the first parameter, whether it's the class name, or an existing object. This lets you do this:
my $fido = Dog->new();
which is very common, and the less likely
my $rover = $fido->new();
Now, why would you want to instantiate an object based on the type of another object? If you want to make $rover
a clone of $fido
, then Dog should have a clone()
method, instead of overloading the meaning of new()
.
That's all the ref($proto) || $proto
does for you. If you don't need that dubious functionality, then write your constructors like this:
sub new {
my $class = shift;
my $self = bless {}, $class;
}
See also Randal Schwartz's take on it at http://www.stonehenge.com/merlyn/UnixReview/col52.html
AUTHOR
Andrew Moore <amoore@mooresystems.com>
ACKNOWLEDGEMENTS
Adapted from policies by Jeffrey Ryan Thalhammer <thaljef@cpan.org>, and work done by Andrew Moore <amoore@mooresystems.com>.
COPYRIGHT
Copyright 2006 Andy Lester <andy at petdance.com>
.
reserved.
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. The full text of this license can be found in the LICENSE file included with this module.