better naming and help command for KeyMangler
[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   my $type = $state->resolve_value($of);
20   my $set = ref($type) ? $type : $state->facts->{$type};
21   if ($member->is_bound) {
22     my $test = $state->resolve_value($member);
23     if (grep { $_ eq $test } $set->all) {
24       return $state->then($self->next);
25     }
26     return $state->backtrack;
27   }
28   my $ref_set = (
29     ref($type)
30       ? $set
31       : DX::RefSet->new(
32           target => $type, names => [ $set->key_list ],
33         )
34   );
35   return $state->then($self->next)
36                ->add_dependencies($member->id, $of->id)
37                ->bind_root_set($member->id, $ref_set)
38 }
39
40 1;