package DX::ShellState;
+use DX::Utils qw(deparse);
use DX::Class;
has template_query_state => (
);
has current_query_state => (
- is => 'ro', predicate => 1, isa => QueryState
+ 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} or $ENV{DX_TRACE};
+ my $dp = deparse($thing);
+ $dp =~ s/\n$//;
+ warn "${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(