rename Deparse to TraceFormatter and add ambient indent level
[scpubgit/DX.git] / lib / DX / ShellState.pm
index 665d9bc..9f77143 100644 (file)
@@ -1,5 +1,6 @@
 package DX::ShellState;
 
+use DX::Utils qw(deparse);
 use DX::Class;
 
 has template_query_state => (
@@ -7,13 +8,42 @@ 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(