move actions to being held by fact objects
[scpubgit/DKit.git] / lib / DX / Result.pm
1 package DX::Result;
2
3 use Safe::Isa;
4 use Moo;
5
6 has _state => (is => 'ro', required => 1, init_arg => 'state');
7
8 sub var_names {
9   sort keys %{$_[0]->_state->scope};
10 }
11
12 sub actions {
13   my ($self) = @_;
14   my $state = $self->_state;
15   my $by_id = $self->_state->by_id;
16   return map $_->required_action,
17            grep $_->has_required_action,
18              grep $_->$_does('DX::Role::Fact'),
19                map $state->resolve_value($_),
20                  values %$by_id;
21 }
22
23 sub independent_actions {
24   my ($self) = @_;
25   return grep !@{$_->dependencies}, $self->actions;
26 }
27
28 sub expand_action_dependencies {
29   my ($self, $action) = @_;
30   my $by_id = $self->_state->by_id;
31   return map $by_id->{$_}->action, @{$action->dependencies};
32 }
33
34 sub value_for {
35   my ($self, $name) = @_;
36   my $state = $self->_state;
37   $state->resolve_value($state->scope_var($name));
38 }
39
40 sub all_values {
41   my ($self) = @_;
42   return +{ map +($_ => $self->value_for($_)), $self->var_names };
43 }
44
45 1;