track action applications
[scpubgit/DX.git] / lib / DX / Role / Predicate.pm
CommitLineData
9d759b64 1package DX::Role::Predicate;
2
3use List::Util qw(reduce);
3e465d5d 4use DX::Utils qw(step CONTENTS_OF);
9d759b64 5use DX::Role;
6
7sub resolution_step_for {
8 my ($self, @args) = @_;
9 my ($last, @rest) = reverse $self->_possible_resolution_list(@args);
10 return undef unless $last;
11 my $targ = $last;
12 $targ = $_->but_with_alternative_step($targ) for @rest;
13 return $targ;
14}
15
16sub _make_equal {
17 my ($self, $left, $right) = @_;
18 if ($left->equals($right)) {
19 return step(
20 actions => [],
3e465d5d 21 depends_on => [
22 [ undef ,=> [ CONTENTS_OF ,=> $left ], [ CONTENTS_OF ,=> $right ] ]
23 ],
9d759b64 24 );
25 }
26 return (
27 do {
28 if ($left->is_set and my $set = $right->action_for_set_value($left)) {
29 step(
30 actions => [ $set ],
0498469a 31 depends_on => [
32 [ $right =>
3e465d5d 33 [ CONTENTS_OF ,=> $left ], [ CONTENTS_OF ,=> $right ]
0498469a 34 ]
35 ]
9d759b64 36 )
37 } else {
38 ()
39 }
40 },
41 do {
42 if ($right->is_set and my $set = $left->action_for_set_value($right)) {
43 step(
44 actions => [ $set ],
0498469a 45 depends_on => [
46 [ $left =>
3e465d5d 47 [ CONTENTS_OF ,=> $left ], [ CONTENTS_OF ,=> $right ]
0498469a 48 ]
49 ]
9d759b64 50 )
51 } else {
52 ()
53 }
54 },
55 );
56}
57
58sub selection_depends_on {
59 my ($self, @args) = @_;
60 \@args;
61}
62
631;