1use strict;
2use warnings;
3
4package Test::Deep::Code;
5
6use Test::Deep::Cmp;
7
8sub init
9{
10	my $self = shift;
11
12	my $code = shift || die "No coderef supplied";
13
14	$self->{code} = $code;
15}
16
17sub descend
18{
19	my $self = shift;
20	my $got = shift;
21
22	my ($ok, $diag) = &{$self->{code}}($got);
23
24	$self->data->{diag} = $diag;
25
26	return $ok;
27}
28
29sub diagnostics
30{
31	my $self = shift;
32	my ($where, $last) = @_;
33
34	my $error = $last->{diag};
35	my $data = Test::Deep::render_val($last->{got});
36	my $diag = <<EOM;
37Ran coderef at $where on
38
39$data
40EOM
41  if (defined($error))
42  {
43    $diag .= <<EOM;
44and it said
45$error
46EOM
47  }
48  else
49  {
50    $diag .= <<EOM;
51it failed but it didn't say why.
52EOM
53  }
54
55	return $diag;
56}
57
581;
59