better naming and help command for KeyMangler
[scpubgit/DKit.git] / lib / DX / Op / CallRule.pm
CommitLineData
b40e416a 1package DX::Op::CallRule;
2
3use DX::Op::SetScope;
4use DX::Op::FromCode;
5use DX::Var;
6use DX::ArrayStream;
7use Moo;
8
9with 'DX::Role::Op';
10
11has rule_name => (is => 'ro', required => 1);
12has rule_args => (is => 'ro', required => 1);
13has full_name => (is => 'lazy', builder => sub {
14 my ($self) = @_;
15 join('/', $self->rule_name, scalar @{$self->rule_args});
16});
17
18sub run {
19 my ($self, $state) = @_;
71217e42 20#warn "Call: ".$self->full_name;
a5c3a041 21 my @args;
22 foreach my $arg (@{$self->rule_args}) {
23 ($state, my $expanded) = $self->_expand_argspec($state, $arg);
24 push @args, $expanded;
25 }
b40e416a 26 my @rules = @{$state->rule_set->rules->{$self->full_name}||[]};
27 die "No rules for ${\$self->full_name}" unless @rules;
734376d9 28 my $var = DX::Var->new(id => "rule:".$self->full_name)
b40e416a 29 ->with_stream(DX::ArrayStream->from_array(@rules));
30 my $invoke = DX::Op::FromCode->new(
31 code => sub {
32 my ($self, $state) = @_;
0676b282 33 my $call = $state->resolve_value($var)->but(args => \@args);
02ae4168 34 $state->but(scope => {})->then($call);
b40e416a 35 }
36 );
37 my $ret_op = DX::Op::SetScope->new(
38 scope => $state->scope, next => $self->next
39 );
40 $state->push_return_then($ret_op, $invoke)->mark_choice($var);
41}
42
431;