develooper Front page | perl.perl6.language | Postings from May 2004

Re: A12: on inheriting wrappers

Thread Previous | Thread Next
From:
Aldo Calpini
Date:
May 4, 2004 06:45
Subject:
Re: A12: on inheriting wrappers
Message ID:
1083678117.6898.30.camel@localhost
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


Thread Previous | Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About