From ac8d7eec0033ae938648be9df84fff05f08aae3b Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Sat, 23 Jun 2012 19:29:23 -0500 Subject: add example of object overloading with recursion --- t/sugar.t | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) (limited to 't') diff --git a/t/sugar.t b/t/sugar.t index 48a14cf..2dacc9f 100644 --- a/t/sugar.t +++ b/t/sugar.t @@ -4,10 +4,14 @@ use warnings; use Test::More; use List::MoreUtils; +use Scalar::Util 'blessed'; { use smartmatch sub { - if (ref($_[1])) { + if (blessed($_[1])) { + return overload::Method($_[1], '~~')->($_[1], $_[0]); + } + elsif (ref($_[1])) { return $_[1]->($_[0]); } else { @@ -17,6 +21,9 @@ use List::MoreUtils; ok("a" ~~ any(1, 2, "foo")); ok(!("a" ~~ any(1, 2, 3))); + + ok("a" ~~ all("foo", "foo", "foo")); + ok(!("a" ~~ all("a", 2, "foo"))); } sub any { @@ -30,4 +37,29 @@ sub any { } } +{ + package Sugar::All; + use overload '~~' => 'sm_overload'; + + sub new { + my $class = shift; + my (%params) = @_; + return bless { rvals => $params{rvals} }, $class; + } + + sub sm_overload { + my $self = shift; + my ($lval) = @_; + + my $recurse = smartmatch::get_smartmatch_callback(1); + return List::MoreUtils::all { $recurse->($lval, $_) } + @{ $self->{rvals} }; + } +} + +sub all { + my @rvals = @_; + return Sugar::All->new(rvals => \@rvals); +} + done_testing; -- cgit v1.2.3-54-g00ecf