1 package DX::ResolutionSpace;
3 use DX::Step::Backtrack;
4 use DX::Step::ResolveProposition;
5 use DX::Utils qw(expand_deps);
8 has proposition => (is => 'ro', isa => Proposition);
10 has geometry_depends_on => (is => 'ro', required => 1, isa => DependencyList);
12 has aperture => (is => 'ro', required => 1, isa => ApertureList);
15 is => 'ro', required => 1, isa => ArrayRef[ResolutionStrategy|Resolution]
21 [ symbol => 'resolution_space' ],
23 [ proposition => $self->proposition ],
24 [ geometry_depends_on => [ block => [
26 [ symbol => (split '::', ${$_->[0]})[-1] ],
27 [ value_path => [ @{$_}[1..$#$_] ] ],
28 ] ], @{expand_deps($self->geometry_depends_on)}
31 ? [ aperture => [ block => [
33 [ symbol => (split '::', ${$_->[0]})[-1] ],
34 [ value_path => [ @{$_}[1..$#$_] ] ],
35 ] ], @{$self->aperture}
38 [ members => [ block => [ @{$self->members} ] ] ]
45 return undef unless my ($first) = @{$self->members};
46 return $first->next_resolution;
49 sub remaining_resolution_space {
51 die "Sense makes not" unless my ($first, @rest) = @{$self->members};
52 return $self->but(members => [ $first->remainder, @rest ]);
57 return DX::Step::Backtrack->new unless @{$self->members};
58 return DX::Step::ResolveProposition->new(resolution_space => $self);