Steve Grazzini wrote:

> On Thu, Oct 23, 2003 at 06:48:29AM -0700, R. Joseph Newton wrote:
> > "Randal L. Schwartz" wrote:
> > > >>>>> "Dan" == Dan Anderson <[EMAIL PROTECTED]> writes:
> > >
> > > Dan>   my $class = ref($proto) || $proto;
> > >
> > > Don't do this!
> >
> > I'm still a little mystified as to what you find offensive there.
>
> [snip]
>
> > I'll grant that I have sometimes felt silly having that construct in a root
> > class, but so far it has not done any actual damage.
>
> There are two things going on --
>
> First, the constructor is taking the classname from the first argument,
> like this:
>
>     sub new {
>       my $class = shift;
>       my $self = { initial => 'data' };
>       bless $self, $class;
>     }
>
> There's nothing wrong with that, and in fact it's *necessary* if a derived
> class wants to inherit the new() method from Foo.  So don't feel silly about
> using "my $class = shift" in a root class!  That's where you really need to
> be using it.
>
> But the constructor is also prepared to take an object as the first argument
> instead of just the classname-as-a-string.  This is explained in perltoot:
>
>     While we're at it, let's make our constructor a bit more flexible.
>     Rather than being uniquely a class method, we'll set it up so that it
>     can be called as either a class method or an object method.  That way
>     you can say:
>
>         $me  = Person->new();
>         $him = $me->new();

Okay, I just found out where I got confused.  I've never read perltoot, but I
skipped over a couple paragraphs, actually a code sample and a paragraph, in
reading perlobj:

    If you care about inheritance (and you should; see the section on
    "Modules: Creation, Use, and Abuse" in the perlmodlib manpage), then you
    want to use the two-arg form of bless so that your constructors may be
    inherited:
[glossed over this:
        sub new {
            my $class = shift;
            my $self = {};
            bless $self, $class;
            $self->initialize();
            return $self;
        }

    Or if you expect people to call not just "CLASS->new()" but also
    "$obj->new()", then use something like this. The initialize() method
    used will be of whatever $class we blessed the object into:
...and connected the text above to the code sample below]

        sub new {
            my $this = shift;
            my $class = ref($this) || $this;
            my $self = {};
            bless $self, $class;
            $self->initialize();
            return $self;
        }


I must say that it makes much more sense reading this way.  The construct is now
much less mysterious, too.

Thanks,

Joseph


-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to