From ab2b93befe9babd98d2141bbf39f36d443d8e311 Mon Sep 17 00:00:00 2001 From: Jonathan Worthington Date: Sun, 26 Jun 2011 02:04:21 +0200 Subject: [PATCH] Implement .+ and .*. --- NOMMAP.markdown | 2 +- src/core/Mu.pm | 23 +++++++++++++++++++++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/NOMMAP.markdown b/NOMMAP.markdown index 8ce7839ba75..b8df179e97b 100644 --- a/NOMMAP.markdown +++ b/NOMMAP.markdown @@ -61,7 +61,7 @@ Many things are working, some are not... * Try to implement enumerations * Some support for augment * handles -* .*, .+ and .Foo::bar +* .Foo::bar * does and but ## Ensure nested packages work diff --git a/src/core/Mu.pm b/src/core/Mu.pm index 0eaf72aa479..e8f8332696c 100644 --- a/src/core/Mu.pm +++ b/src/core/Mu.pm @@ -75,11 +75,30 @@ my class Mu { } method dispatch:<.+>($name, *@pos, *%named) { - die ".+ not yet implemented" + my @result := self.dispatch:<.*>($name, |@pos, |%named); + if @result.elems == 0 { + die "Method '$name' not found for invocant of type '" ~ + self.WHAT.perl ~ "'"; + } + @result } method dispatch:<.*>($name, *@pos, *%named) { - die ".* not yet implemented" + my @mro = self.HOW.mro(self); + my @results; + my $i = 0; + while $i < +@mro { + my $obj = @mro[$i]; + my $meth = ($obj.HOW.method_table($obj)){$name}; + if !$meth && $i == 0 { + $meth = ($obj.HOW.submethod_table($obj)){$name}; + } + if $meth { + @results.push($meth($obj, |@pos, |%named)); + } + $i++; + } + &infix:<,>(|@results) } }