allow value scalarref, refactor
[scpubgit/DKit.git] / lib / DX / Role / Op.pm
index 11294d1..83b9e86 100644 (file)
@@ -11,4 +11,29 @@ sub but {
   $self->new(%$self, @but);
 }
 
+sub _expand_args {
+  my ($self, $state, %spec) = @_;
+  my %args;
+  @args{keys %spec} = map $self->_expand_argspec($state, $_), values %spec;
+  return $state->expand_vars(%args);
+}
+
+sub _expand_argspec {
+  my ($self, $state, $spec) = @_;
+  if (!ref($spec)) {
+    $state->scope_var($spec)
+  } elsif (ref($spec) eq 'ARRAY') {
+    if ($spec->[0] eq 'value') {
+      +{ bound_value => $spec->[1] };
+    } else {
+      die "Arrayref in argspec is not value";
+    }
+  } elsif (ref($spec) eq 'SCALAR' or ref($spec) eq 'REF') {
+    return +{ bound_value => $$spec };
+  } else {
+    die "Argspec incomprehensible";
+  }
+}
+
+
 1;