832150bf629daf8591643d920f4b8e50149ad69d
[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 resolution_step_for {
8   my ($self, $prop, @args) = @_;
9   my ($last, @rest) = reverse $self->_possible_resolution_list(@args);
10   return undef unless $last;
11   my $targ = $last->but(resolves => $prop);
12   $targ = $_->but(
13     alternative_step => $targ,
14     resolves => $prop
15   ) for @rest;
16   return $targ;
17 }
18
19 sub _make_equal {
20   my ($self, $left, $right) = @_;
21   if ($left->equals($right)) {
22     return step(
23       actions => [],
24       depends_on => [
25         [ undef ,=> [ CONTENTS_OF ,=> $left ], [ CONTENTS_OF ,=> $right ] ]
26       ],
27     );
28   }
29   return (
30     do {
31       if ($left->is_set and my $set = $right->action_for_set_value($left)) {
32         step(
33           actions => [ $set ],
34           depends_on => [
35             [ $right =>
36               [ CONTENTS_OF ,=> $left ], [ CONTENTS_OF ,=> $right ]
37             ]
38           ]
39         )
40       } else {
41         ()
42       }
43     },
44     do {
45       if ($right->is_set and my $set = $left->action_for_set_value($right)) {
46         step(
47           actions => [ $set ],
48           depends_on => [
49             [ $left =>
50               [ CONTENTS_OF ,=> $left ], [ CONTENTS_OF ,=> $right ]
51             ]
52           ]
53         )
54       } else {
55         ()
56       }
57     },
58   );
59 }
60
61 sub selection_depends_on {
62   my ($self, @args) = @_;
63   \@args;
64 }
65
66 1;