X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDX%2FState.pm;h=b4ad2334fa6d672aa77eeef06ac9f487d76539fa;hb=b373788e29bdee028a124201fd1c2ca85f02ac48;hp=7ec2e1b95979d44b3a9a5be3f8aba40d0086cfae;hpb=b40d5c51f4c9706df66414a69695860b37fbaca0;p=scpubgit%2FDKit.git diff --git a/lib/DX/State.pm b/lib/DX/State.pm index 7ec2e1b..b4ad233 100644 --- a/lib/DX/State.pm +++ b/lib/DX/State.pm @@ -2,6 +2,7 @@ package DX::State; use Return::MultiLevel qw(with_return); use DX::Op::FromCode; +use Scalar::Util qw(blessed); use Moo; has next_op => (is => 'ro', required => 1); @@ -14,11 +15,35 @@ has scope => (is => 'ro', required => 1); has last_choice => (is => 'ro', required => 1); +has id_gen => (is => 'ro', default => sub { {} }); + sub scope_var { my ($self, $name) = @_; $self->by_id->{$self->scope->{$name}}; } +sub allocate_var { + my ($self, $name, $var) = @_; + my $id = join('_', $name, ++($self->id_gen->{$name})); + DX::Var->new(id => $id, %$var); +} + +sub assign_vars { + my ($self, %vars) = @_; + my %by_id = %{$self->by_id}; + foreach my $name (keys %vars) { +warn "assign: ${name}"; + unless (blessed($vars{$name})) { + my $var = $vars{$name} = $self->allocate_var($name, $vars{$name}); + $by_id{$var->id} = $var; + } + } + $self->but( + by_id => \%by_id, + scope => { %{$self->scope}, map +($_ => $vars{$_}->id), keys %vars } + ); +} + sub bind_var_then { my ($self, $var, $value, $then) = @_; warn "Binding ".$var->id." to $value"; @@ -70,6 +95,7 @@ sub run { my ($return) = @_; local our $Nonlocal_Return = $return; while (my $op = $state->next_op) { +#::Dwarn($op); $state = $op->run($state); } return $state;