sourCEntral - mobile manpages




Perl::Critic::Policy::Bangs::ProhibitRefProtoOrProto − Create a "clone()" method if you need copies of objects.


This Policy is part of the Perl::Critic::Bangs distribution.


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 <>.


This Policy is not configurable except for the standard options.


Andrew Moore <amoore AT mooresystems DOT com>


Adapted from policies by Jeffrey Ryan Thalhammer <thaljef AT cpan DOT org>, and work done by Andrew Moore <amoore AT mooresystems DOT com>.


Copyright (C) 2006−2011 Andy Lester

This library is free software; you can redistribute it and/or modify it under the terms of the Artistic License 2.0.