On Fri, 2004-04-30 at 19:01, Larry Wall wrote:
> That would almost certainly fail with an error saying that it couldn't
> find your &new subroutine.  The & sigil does not imply dispatch, and
> the default .new is inherited, not autogenerated, last I checked.  :-)

ouch. too true.

so I guess my Animal class should be written as:

    class Animal {
        our @.zoo;
        method new(Class $class: *%_) {
            my $self = $class.bless(0, *%_);
            push(@.zoo, $self);
            return $self;
        }
    }

but: what if Animal does inherits from something else? what I would like
to do (what I was trying to do with wrappers, that is) is to call the
inherited constructor, then do something with the returned object.
something like:

    method new(Class $class: *%_) {
        my $self = $class.WALK[:omit(::_)].new(*%_);
        push(@.zoo, $self);
        return $self;
    }

this is based, of course, on the assumption that ::_ always contains
"Animal", even when building a "Lion is Animal" object.

or, if I read correctly the paragraph in "Calling Superclasses, and
Not-So-Superclasses":

    Now, sometimes you want to call the net method, but you want to 
    change the arguments [...] If you use the call keyword in an
    ordinary (nonwrapper) method, it steals the rest of the dispatch
    list from the outer loop [...]

perhaps my method could be:

    method new(Class $class: *%_) {
        my $self = call($class, *%_);
        push(@.zoo, $self);
        return $self;
    }

but are the arguments still passed correctly (eg. $class as the
invocant) in this case?

cheers,
Aldo

Reply via email to