Skip to content


Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

187 lines (147 sloc) 5.596 kb
use v6;
use Test;
plan 39;
# L<S12/Single inheritance/An "isa" is just a trait that happens to be another class>
class Foo {
has $.bar is rw;
has $.value is rw;
method baz { return 'Foo::baz' }
method getme($self:) returns Foo { return $self }
class Foo::Bar is Foo {
has $.bar2 is rw;
method baz { return 'Foo::Bar::baz' }
method fud { return 'Foo::Bar::fud' }
method super_baz ($self:) { return $self.Foo::baz() }
class Unrelated {
method something { 'bad' };
my $foo_bar =;
isa_ok($foo_bar, Foo::Bar);
ok(!defined($foo_bar.bar2()), '... we have our autogenerated accessor');
ok(!defined($, '... we inherited the superclass autogenerated accessor');
lives_ok { $ = 'BAR' }, '... our inherited the superclass autogenerated accessor is rw';
is($, 'BAR', '... our inherited the superclass autogenerated accessor is rw');
lives_ok { $foo_bar.bar2 = 'BAR2'; }, '... our autogenerated accessor is rw';
is($foo_bar.bar2(), 'BAR2', '... our autogenerated accessor is rw');
is($foo_bar.baz(), 'Foo::Bar::baz', '... our subclass overrides the superclass method');
is($foo_bar.super_baz(), 'Foo::baz', '... our subclass can still access the superclass method through Foo::');
is($foo_bar.fud(), 'Foo::Bar::fud', '... sanity check on uninherited method');
is($foo_bar.getme, $foo_bar, 'can call inherited methods');
is($foo_bar.getme.baz, "Foo::Bar::baz", 'chained method dispatch on altered method');
ok(!defined($foo_bar.value), 'value can be used for attribute name in derived classes');
my $fud;
lives_ok { $fud = $foo_bar.getme.fud }, 'chained method dispatch on altered method';
is($fud, "Foo::Bar::fud", "returned value is correct");
is $foo_bar.Foo::baz, 'Foo::baz', '$obj.Class::method syntax works';
#?pugs todo
dies_ok { $foo_bar.Unrelated::something() },
'Cannot call unrelated method with $obj.Class::method syntax';
# See thread "Quick OO .isa question" on p6l started by Ingo Blechschmidt:
# L<"">
ok Foo::Bar.isa(Foo), "subclass.isa(superclass) is true";
ok Foo::Bar.isa(Foo::Bar), "subclass.isa(same_subclass) is true";
#?pugs skip 'No compatible multi variant found: "&isa"'
ok Foo::Bar.HOW.isa(Foo::Bar, Foo), "subclass.HOW.isa(superclass) is true";
#?pugs skip 'No compatible multi variant found: "&isa"'
ok Foo::Bar.HOW.isa(Foo::Bar, Foo::Bar), "subclass.HOW.isa(same_subclass) is true";
#?pugs todo
my $test = '$obj.$meth is canonical (audreyt says)';
class Abc {
method foo () { "found" }
class Child is Abc { }
is( eval('my $meth = "foo"; my $obj=; $obj."$meth"()'), 'found', $test);
# Erroneous dispatch found by TimToady++
class X {
method j () { 'X' }
class Z is X {}
class Y is X {
method k () { }
method j () { 'Y' }
is(, 'X', 'inherited method dispatch works');
is(, 'X', 'inherited method dispatch works inside another class with same-named method');
my class A {
has @.x = <a b c>;
has $.w = 9;
method y($i) { return @.x[$i]; }
my class B is A {
has $.w = 10;
method z($i) { return $.y($i); }
is(, 'b', 'initializer carries through' );
is(, 10, 'initializer can be overridden by derived classes' );
# test that you can inherit from a class with :: in the name.
class A::B {
method ab { 'a'; };
class A::B::C is A::B {
method abc { 'b'; };
my $o =;
ok defined($o), 'can instantiate object from class A::B::C';
is $o.ab, 'a', 'can access inherited method';
is $, 'b', 'can access directly defined method';
# Make sure inheritance from Mu works (got broken in Rakudo once).
eval_lives_ok 'class NotAny is Mu { };', 'inheritance from Mu works';
class DirectMu is Mu { };
ok DirectMu !~~ Any, 'class inheriting from Mu is not Any';
#?niecza skip 'Unable to resolve method parents in class ClassHOW'
#?pugs skip 'No such method in class Class: "&parents"'
ok !( any(DirectMu.^parents).gist eq 'Any()'), 'and Any does not appear in the list of parents either';
#?pugs todo
eval_dies_ok 'class RT64642 is ::Nowhere {}', 'dies: class D is ::C {}';
# check that inheriting from Array works
#?pugs skip "Can't modify constant item: VUndef"
class ArrayChild is Array {
method summary() { self.join(', ') }
my $a =;
is $a.join('|'), 'foo|bar', 'inheritance from Array';
is $a.summary, 'foo, bar', 'and ArrayChild methods work';
my @a :=;
@a.push: 3, 5;
is @a.summary, '3, 5', 'new methods still work in @ variables';
# RT #82814
#?pugs skip 'callsame'
my class A {
method new { self.bless(*) }
my class B is A {
has $.c is rw;
method new {
my $obj = callsame;
$obj.c = 42;
return $obj
is, 42, 'nextsame in constructor works';
# RT 75376
#?pugs skip 'No such subroutine: "&RT75376::B"'
#?niecza skip "Pathed definitions require our scope"
my class RT75376::A { };
lives_ok { our class RT75376::B is RT75376::A { } },
'our-scoped class can inherit from my-scoped class';
ok (RT75376::B.^mro[0] ~~ RT75376::B and RT75376::B.^mro[1] ~~ RT75376::A),
'our-scoped class inherited from my-scoped class has proper inheritance hierarchy';
# vim: ft=perl6
Jump to Line
Something went wrong with that request. Please try again.