Commit | Line | Data |
9d759b64 |
1 | package DX::Role::Predicate; |
2 | |
3 | use List::Util qw(reduce); |
3e465d5d |
4 | use DX::Utils qw(step CONTENTS_OF); |
9d759b64 |
5 | use DX::Role; |
6 | |
113f21b9 |
7 | sub _possible_resolution_list { |
8 | my ($self, @args) = @_; |
9 | my $rspace = $self->_resolution_space_for(@args); |
10 | my @res; |
11 | while (my $next_res = $rspace->next_resolution) { |
12 | $rspace = $rspace->remaining_resolution_space; |
13 | push @res, step( |
14 | actions => $next_res->actions, |
15 | depends_on => $next_res->veracity_depends_on, |
16 | ); |
17 | } |
18 | return @res; |
19 | } |
20 | |
9d759b64 |
21 | sub resolution_step_for { |
ccf0d4fe |
22 | my ($self, $prop, @args) = @_; |
9d759b64 |
23 | my ($last, @rest) = reverse $self->_possible_resolution_list(@args); |
24 | return undef unless $last; |
ccf0d4fe |
25 | my $targ = $last->but(resolves => $prop); |
26 | $targ = $_->but( |
27 | alternative_step => $targ, |
28 | resolves => $prop |
29 | ) for @rest; |
9d759b64 |
30 | return $targ; |
31 | } |
32 | |
9d759b64 |
33 | 1; |