my %args = @_;
my $stash = delete $args{stash} || { };
- my $tool = delete $args{tool};
- $class->_croak('Invalid tool') unless Scalar::Util::blessed($tool)
- and $tool->isa('Test::Valgrind::Tool');
- $stash->{tool} = $tool;
-
bless $class->XML::Twig::new(
elt_class => __PACKAGE__ . '::Elt',
stash => $stash,
sub stash { shift->{Stash} }
+# We must store the session in ourselves because it's only possible to pass
+# arguments to XML::Twig objects by a global stash.
+
+sub _session { @_ <= 1 ? $_[0]->{_session} : ($_[0]->{_session} = $_[1]) }
+
+sub start {
+ my ($self, $sess) = @_;
+
+ $self->SUPER::start($sess);
+ $self->_session($sess);
+
+ return;
+}
+
+sub parse {
+ my ($self, $sess, $fh) = @_;
+
+ $self->XML::Twig::parse($fh);
+ $self->purge;
+
+ return;
+}
+
+sub finish {
+ my ($self, $sess) = @_;
+
+ $self->_session(undef);
+ $self->SUPER::finish($sess);
+
+ return;
+}
+
sub handle_error {
my ($twig, $node) = @_;
$origin->kid('stack')->children('frame') ];
}
- my $tool = $twig->stash->{tool};
- my $sess = $tool->_session;
+ my $sess = $twig->_session;
- $sess->report($tool->report_class($sess)->new(
+ $sess->report($sess->report_class($sess)->new(
kind => $kind,
id => $id,
data => $data,