proposition_sequence
=> use_module('DX::PropositionSequence')->new_empty,
),
+ trace_these => {},
),
),
(@ARGV
});
$tcl->CreateCommand('...' => sub {
$self->apply_to_state([ mode => 'shell' ]);
- my ($cur) = $self->shell_state->current_query_state;
+ my $orig = my $cur = $self->shell_state->current_query_state;
while ($cur) {
$self->_set_shell_state(
$self->shell_state->but(current_query_state => $cur)
$cur = eval { $cur->with_forced_backtrack };
push our @Result, [ output => $@ ] if $@;
}
+ $self->_set_shell_state(
+ $self->shell_state->but(
+ current_query_state => $orig
+ ),
+ );
+ return;
});
$tcl->CreateCommand(qlist => sub {
push our @Result, map [ output => $_ ], @{
),
);
});
+ $tcl->CreateCommand(trace => sub {
+ my (undef, undef, undef, @trace) = @_;
+ $self->_set_shell_state(
+ $self->shell_state->with_trace_changes(@trace)
+ );
+ });
return $tcl;
});
is => 'lazy', builder => 'new_query_state'
);
+has trace_these => (
+ is => 'ro', required => 1,
+);
+
has mode => (is => 'ro', required => 1);
sub new_query_state { $_[0]->template_query_state }
sub trace_sub {
+ my ($self) = @_;
sub {
my ($tag, $thing) = @_;
+ my ($part) = split /\./, $tag;
+ return unless $self->trace_these->{$part};
my $dp = deparse($thing);
$dp =~ s/\n$//;
warn "${tag}: ${dp}\n";
}
}
+sub with_trace_changes {
+ my ($self, @changes) = @_;
+ my %trace = %{$self->trace_these};
+ foreach my $change (@changes) {
+ if ($change =~ /^\+?(\w+)/) {
+ $trace{$1} = 1;
+ } elsif ($change =~ /^-(\w+)/) {
+ delete $trace{$1};
+ }
+ }
+ return $self->but(trace_these => \%trace);
+}
+
sub with_new_query_state {
my ($self) = @_;
$self->but(