better naming and help command for KeyMangler
[scpubgit/DKit.git] / lib / DX / Op / MemberOf.pm
CommitLineData
b40e416a 1package DX::Op::MemberOf;
2
3use DX::ArrayStream;
4ce2e778 4use DX::RefSet;
b40e416a 5use Moo;
6
7with 'DX::Role::Op';
8
9has member_var => (is => 'ro', required => 1);
385fa954 10has coll_var => (is => 'ro', required => 1);
b40e416a 11
12sub run {
13 my ($self, $state) = @_;
385fa954 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)};
db920199 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 )
4ce2e778 34 );
7a0670cd 35 return $state->then($self->next)
36 ->add_dependencies($member->id, $of->id)
4ce2e778 37 ->bind_root_set($member->id, $ref_set)
b40e416a 38}
39
401;