use FactRef objects to sanify action handling
[scpubgit/DKit.git] / lib / DX / Op / MemberOf.pm
1 package DX::Op::MemberOf;
2
3 use DX::ArrayStream;
4 use DX::RefSet;
5 use Moo;
6
7 with 'DX::Role::Op';
8
9 has member_var => (is => 'ro', required => 1);
10 has coll_var => (is => 'ro', required => 1);
11
12 sub run {
13   my ($self, $state) = @_;
14   ($state, my %args) = $self->_expand_args($state,
15     member => $self->member_var,
16     of => $self->coll_var
17   );
18   my ($member, $of) = @args{qw(member of)};
19   die "member bound" if $member->is_bound;
20   my $set = $state->facts->{my $type = $state->resolve_value($of)};
21   my $ref_set = DX::RefSet->new(
22     target => $type, names => [ $set->key_list ],
23   );
24   return $state->then($self->next)
25                ->add_dependencies($member->id, $of->id)
26                ->bind_root_set($member->id, $ref_set)
27 }
28
29 1;