format aperture in backtrack trace
[scpubgit/DX.git] / lib / DX / Hypothesis.pm
1 package DX::Hypothesis;
2
3 use DX::ActionPolicy::LockScope;
4 use DX::Utils qw(deparse);
5 use DX::Class;
6
7 has scope => (is => 'ro', isa => Scope, required => 1);
8
9 has resolved_propositions => (
10   is => 'ro', isa => ResolvedPropositionSet, required => 1
11 );
12
13 has actions => (
14   is => 'ro', isa => ArrayRef[Action], required => 1
15 );
16
17 has action_applications => (
18   is => 'ro', isa => ArrayRef[Action], required => 1
19 );
20
21 has action_policy => (is => 'ro', isa => ActionPolicy, required => 1);
22
23 sub with_actions {
24   my ($self, @actions) = @_;
25   my $hyp = $self;
26   my @events;
27   foreach my $act (@actions) {
28     return undef unless $self->action_policy->allows($act);
29     ($hyp, my @these_events) = $act->dry_run($hyp);
30     return undef unless $hyp;
31     push @events, @these_events;
32   }
33   my ($still_resolved, @recheck) = $hyp->resolved_propositions
34                                        ->but_expire_for(@events);
35   return (
36     $hyp->but(resolved_propositions => $still_resolved),
37     @recheck
38   );
39 }
40
41 sub with_resolution {
42   my ($self, $prop, $depends, $actions) = @_;
43   (my $hyp, my @recheck) = $self->with_actions(@$actions);
44   return undef unless $hyp;
45   return (
46     $hyp->but(
47       resolved_propositions => $self->resolved_propositions
48                                     ->with_resolution_for(
49                                         $prop,
50                                         $depends,
51                                       ),
52     ),
53     @recheck
54   );
55 }
56
57 1;