Method/attribute chaining

2 views
Skip to first unread message

Alex Gutteridge

unread,
May 24, 2005, 7:46:56 AM5/24/05
to perl6-c...@perl.org
Hi,

Just playing around with pugs 6.2.5 OO and couldn't work this out:

class Bowl {
has $.fish is rw;
has $.water is rw;
}
class Fish {
has $.bowl is rw;
has $.eyes is rw;
}

my $bowl = Bowl.new;
my $blinky = Fish.new;

$bowl.water = 'Murky';
$blinky.eyes = 3;

$bowl.fish = $blinky;
$blinky.bowl = $bowl;

$bowl.water.say;
$blinky.eyes.say;

my $blinkys_bowl = $blinky.bowl;
$blinkys_bowl.water.say;

my $fishy = $bowl.fish;
$fishy.eyes.say;

$bowl.fish.eyes.say;
$blinky.bowl.water.say;

The output I get:

Murky
3
Murky
3
*** No compatible subroutine found: "&eyes"
at Desktop/testOO.pl line 27, column 1-20

Am I missing something in the syntax when I try to chain the
attribute methods? Or is this not implemented in pugs yet?

Thanks for any help.

Alex Gutteridge

EBI
Wellcome Trust Genome Campus
Hinxton
Cambs CB10 1SD
UK

Tel: 01223 492546
Email: al...@ebi.ac.uk


Adrian Taylor

unread,
May 24, 2005, 7:52:49 AM5/24/05
to Alex Gutteridge, perl6-c...@perl.org
Hi,

I have seen similar weirdness and added a couple of tests over the
weekend, whilst simultaneously forgetting to mention it on IRC:

class Foo {
method noargs () { 42 }
method callsmethod2 { .noargs(); }
}

$val = $foo.callsmethod2()

dies. (t/oo/method/instance.t)

It appears to be something to do with whether the methods are declared
with brackets (method callsmethod2 versus method callsmethod2()).

Maybe this is related.

Cheers

Ade

Alex Gutteridge

unread,
May 24, 2005, 8:53:42 AM5/24/05
to Adrian Taylor, perl6-c...@perl.org
Hi,

I've written up the case I found as a test, please feel free to add
it if it's useful. All tests pass apart from the last one which tests
attribute chaining. Tested on Pugs 6.2.5.

#!/usr/bin/pugs

use v6;
use Test;

plan 7;

#Setup
class Foo {
has $.bar is rw;
}

my $foo = Foo.new;
my $foo2 = Foo.new;

#Sanity check
isa_ok($foo, 'Foo');
isa_ok($foo2, 'Foo');

#Setup chain
$foo.bar = $foo2;
$foo2.bar = 'baz';

#Sanity check part two
is($foo2.bar, 'baz', '... got the right value in $foo2');
is($foo.bar =:= $foo2, 1, '... $foo is storing $foo2');

#Extract last part of chain
my $foo3 = $foo.bar;

#and check its fine
is($foo3 =:= $foo2, 1, '... we can retrieve $foo2 as $foo3');
is($foo3.bar, 'baz', '... got the right value in $foo3');

#Check chaining
lives_ok{
$foo.bar.bar == 'baz' ;
}, '... attribute chaining is OK';

Autrijus Tang

unread,
Jun 1, 2005, 3:05:55 AM6/1/05
to Alex Gutteridge, Adrian Taylor, perl6-c...@perl.org
On Tue, May 24, 2005 at 01:53:42PM +0100, Alex Gutteridge wrote:
> I've written up the case I found as a test, please feel free to add
> it if it's useful. All tests pass apart from the last one which tests
> attribute chaining. Tested on Pugs 6.2.5.

Thanks, stevan applied it and I believe it now works correclty.

/Autrijus/

Reply all
Reply to author
Forward
0 new messages