> > Furthermore, it proposes that both C<SETUP> and C<DESTROY> methods
   > > should be invoked hierarchically in all base classes.
   > 
   > This bothers me.  It leaves no way to override the behavior of a
   > parent's SETUP and DESTROY, you can only overlay.  You mentioned that
   > this is normal for most other OO languages, so I presume there's a way
   > to deal with this?

The issue never arises. It's always assumed that as a client of the base
class a derived class has no business medding in the base's implementation.


   > Also, having never really desired hierarchical DESTROYs, its not
   > obvious to me why this is useful.  Could you explain why? (and for the
   > benefit of those who don't own OO Perl or made the mistake of loaning
   > it out.)

Suppose you inherit from a class with a non-trivial destructor.
Say, File::Lock, whose destructor releases a lock on a file when
the object goes out of scope. Now you create a File::LockAndKey,
which requires a special File::Key object to acquire the lock.
When the File::LockAndKey object goes out of scope, the File::Key object
has to be informed, so you need File::LockAndKey::DESTROY to do that.
As soon as you provide that method, File::Lock::DESTROY ceases to be
called and your files never unlock. :-(

   > PS  Proposing SETUP, UNIVERSAL::new() and the hierarchical calls are
   > three unrelated issues and should probably be three different RFCs.

I felt they were all inextricably linked. See below.


   > >         package UNIVERSAL;
   > >         
   > >         sub new { bless {}, @_ }
   > 
   > Shouldn't that be:
   > 
   >     sub new {
   >         my($proto) = shift;
   >         my($class) = ref $proto || $proto;
   > 
   >         bless {}, $class;
   >     }
   > 
   > I prefer new() to be both an object and a class method 

You must have missed RFC 187, which covers that. I've proposed that
the second argument to bless *automatically* apply C<ref $proto || $proto> :-)


   > Also, do we want to do anything with the rest of the arguments?

Err, I already was.

        bless {}, @_;

is:

        bless {}, $_[0], @_[1..$#_];

which passes the remaining ctor arguments directly to your C<SETUP> method.
Neat, huh? :-)

(That's why the C<SETUP> and default C<new> are in the same RFC. Obviously 
I didn't make the connection clear enough in the RFC. I'll remedy that.)


Damian

Reply via email to