lift some of the rspace handling into the Resolution* classes
[scpubgit/DX.git] / lib / DX / Role / Predicate.pm
1 package DX::Role::Predicate;
2
3 use List::Util qw(reduce);
4 use DX::Utils qw(step CONTENTS_OF);
5 use DX::Role;
6
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
21 sub resolution_step_for {
22   my ($self, $prop, @args) = @_;
23   my ($last, @rest) = reverse $self->_possible_resolution_list(@args);
24   return undef unless $last;
25   my $targ = $last->but(resolves => $prop);
26   $targ = $_->but(
27     alternative_step => $targ,
28     resolves => $prop
29   ) for @rest;
30   return $targ;
31 }
32
33 sub selection_depends_on {
34   my ($self, @args) = @_;
35   \@args;
36 }
37
38 1;