This is an automated email from the git hooks/post-receive script.

js pushed a commit to tag 0.043_02
in repository libtype-tiny-perl.

commit 01413879c0fb9acbcacc7b2c0e3d618a11742440
Author: Toby Inkster <m...@tobyinkster.co.uk>
Date:   Fri Apr 11 23:10:09 2014 +0100

    Implement a find_parent method.
---
 lib/Type/Tiny.pm            | 34 ++++++++++++++++++++++++++++++++++
 t/20-unit/Type-Tiny/basic.t | 20 ++++++++++++++++++++
 2 files changed, 54 insertions(+)

diff --git a/lib/Type/Tiny.pm b/lib/Type/Tiny.pm
index 64d6efa..ee960ac 100644
--- a/lib/Type/Tiny.pm
+++ b/lib/Type/Tiny.pm
@@ -490,6 +490,30 @@ sub parents
        return ($self->parent, $self->parent->parents);
 }
 
+sub find_parent
+{
+       my $self = shift;
+       my ($test) = @_;
+       
+       local ($_, $.);
+       my $type  = $self;
+       my $count = 0;
+       while ($type)
+       {
+               if ($test->($_=$type, $.=$count))
+               {
+                       return wantarray ? ($type, $count) : $type;
+               }
+               else
+               {
+                       $type = $type->parent;
+                       $count++;
+               }
+       }
+       
+       return;
+}
+
 sub check
 {
        my $self = shift;
@@ -1484,6 +1508,16 @@ place where multiple type constraints are returned; and 
they are returned
 as an arrayref in violation of the base class' documentation. I'm keeping
 my behaviour as it seems more useful. >>
 
+=item C<< find_parent($coderef) >>
+
+Loops through the parent type constraints I<< including the invocant
+itself >> and returns the nearest ancestor type constraint where the
+coderef evaluates to true. Within the coderef the ancestor currently
+being checked is C<< $_ >>. Returns undef if there is no match.
+
+In list context also returns the number of type constraints which had
+been looped through before the matching constraint was found.
+
 =item C<< coercibles >>
 
 Return a type constraint which is the union of type constraints that can be
diff --git a/t/20-unit/Type-Tiny/basic.t b/t/20-unit/Type-Tiny/basic.t
index 4130464..461dd84 100644
--- a/t/20-unit/Type-Tiny/basic.t
+++ b/t/20-unit/Type-Tiny/basic.t
@@ -136,4 +136,24 @@ use Types::Standard ();
        );
 }
 
+my $t1 = Types::Standard::Int;
+my $t2 = $t1->create_child_type(name => 'T2');
+my $t3 = $t2->create_child_type(name => 'T3');
+my $t4 = $t3->create_child_type(name => 'T4');
+my $t5 = $t4->create_child_type(name => 'T5');
+my $t6 = $t5->create_child_type(name => 'T6');
+
+my $found = $t6->find_parent(sub {
+       $_->has_parent and $_->parent->name eq 'Int'
+});
+
+is($found->name, 'T2', 'find_parent (scalar context)');
+
+my ($found2, $n) = $t6->find_parent(sub {
+       $_->has_parent and $_->parent->name eq 'Int'
+});
+
+is($found2->name, 'T2', 'find_parent (list context)');
+is($n, 4, '... includes a count');
+
 done_testing;

-- 
Alioth's /usr/local/bin/git-commit-notice on 
/srv/git.debian.org/git/pkg-perl/packages/libtype-tiny-perl.git

_______________________________________________
Pkg-perl-cvs-commits mailing list
Pkg-perl-cvs-commits@lists.alioth.debian.org
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-perl-cvs-commits

Reply via email to