1use strict;
2use warnings;
3
4use Params::Validate qw( validate SCALAR );
5use Test::More;
6
7for my $i ( 1 .. 1000 ) {
8    ok( bar(), 'bar()' );
9    is( foo( foo => $i ), $i, "reentrant validation works ($i)" );
10}
11
12done_testing();
13
14sub foo {
15    my %p = validate(
16        @_,
17        {
18            foo => {
19                callbacks => {
20                    'call bar' => sub { bar() }
21                },
22            },
23        },
24    );
25
26    return $p{foo};
27}
28
29sub bar {
30    my %p = baz( baz => 42 );
31
32    return $p{baz} == 42;
33}
34
35sub baz {
36    my %p = validate(
37        @_,
38        {
39            baz => {
40                type      => SCALAR,
41                callbacks => {
42                    'is num' => sub { $_[0] =~ /^\d+$/ },
43                },
44            },
45        },
46    );
47
48    return %p;
49}
50