1 package DX::Op::CallRule;
11 has rule_name => (is => 'ro', required => 1);
12 has rule_args => (is => 'ro', required => 1);
13 has full_name => (is => 'lazy', builder => sub {
15 join('/', $self->rule_name, scalar @{$self->rule_args});
19 my ($self, $state) = @_;
23 } elsif (ref($_) eq 'ARRAY') {
24 if ($_->[0] eq 'value') {
25 +{ bound_value => $_->[1] };
27 die "Arrayref in argspec is not value";
30 die "Argspec incomprehensible";
32 } @{$self->rule_args};
33 my @rules = @{$state->rule_set->rules->{$self->full_name}||[]};
34 die "No rules for ${\$self->full_name}" unless @rules;
35 my $var = DX::Var->new(id => 'OR')
36 ->with_stream(DX::ArrayStream->from_array(@rules));
37 my $invoke = DX::Op::FromCode->new(
39 my ($self, $state) = @_;
40 my ($names, $body) = @{$var->bound_value};
41 my %new; @new{@$names} = @args;
42 $state->but(scope => {})->assign_vars(%new)->then($body);
45 my $ret_op = DX::Op::SetScope->new(
46 scope => $state->scope, next => $self->next
48 $state->push_return_then($ret_op, $invoke)->mark_choice($var);