indirect via resolve_value method
[scpubgit/DKit.git] / lib / DX / Op / Prop.pm
CommitLineData
896fd92e 1package DX::Op::Prop;
2
3use Moo;
4
5with 'DX::Role::Op';
6
7has of => (is => 'ro', required => 1);
8has name => (is => 'ro', required => 1);
9has value => (is => 'ro', required => 1);
10
11sub run {
12 my ($self, $state) = @_;
13 ($state, my %args) = $self->_expand_args(
14 $state, map +($_ => $self->$_), qw(of name value)
15 );
16 die "property name must be bound" unless $args{name}->is_bound;
0676b282 17 my $name = $state->resolve_value($args{name});
896fd92e 18 if ($args{of}->is_bound) {
19 if ($args{value}->is_bound) {
0676b282 20 if ($state->resolve_value($args{of})->$name
21 eq $state->resolve_value($args{value})) {
deec7cc4 22 return $state->add_dependencies(
23 $args{of}->id => $args{value}->id,
24 $args{value}->id => $args{of}->id,
25 )
26 ->then($self->next);
896fd92e 27 }
28 return $state->backtrack;
29 }
0676b282 30 my $value = $state->resolve_value($args{of});
896fd92e 31 if ($value->can("has_${name}") and not $value->${\"has_${name}"}) {
32 return $state->backtrack;
33 }
deec7cc4 34 return $state->bind_value($args{value}->id, $value->$name)
35 ->add_dependencies($args{value}->id => $args{of}->id)
36 ->then($self->next);
896fd92e 37 }
38 die "Can't yet handle unbound 'of' argument";
39}
40
411;