#
# Copyright (C) 1999 Ken MacLeod
# XML::Handler::XMLWriter is free software; you can redistribute it and/or
# modify it under the same terms as Perl itself.
#
# $Id: Subs.pm,v 1.2 1999/12/22 21:15:00 kmacleod Exp $
#
use strict;
package XML::Handler::Subs;
use UNIVERSAL;
use vars qw{ $VERSION };
# will be substituted by make-rel script
$VERSION = "0.08";
sub new {
my $type = shift;
my $self = ($#_ == 0) ? { %{ (shift) } } : { @_ };
return bless $self, $type;
}
sub start_document {
my ($self, $document) = @_;
$self->{Names} = [];
$self->{Nodes} = [];
}
sub end_document {
my ($self, $document) = @_;
delete $self->{Names};
delete $self->{Nodes};
return();
}
sub start_element {
my ($self, $element) = @_;
push @{$self->{Names}}, $element->{Name};
push @{$self->{Nodes}}, $element;
my $el_name = "s_" . $element->{Name};
$el_name =~ s/[^a-zA-Z0-9_]/_/g;
if ($self->can($el_name)) {
$self->$el_name($element);
return 1;
}
return 0;
}
sub end_element {
my ($self, $element) = @_;
my $called_sub = 0;
my $el_name = "e_" . $element->{Name};
$el_name =~ s/[^a-zA-Z0-9_]/_/g;
if ($self->can(${el_name})) {
$self->$el_name($element);
$called_sub = 1;
}
pop @{$self->{Names}};
pop @{$self->{Nodes}};
return $called_sub;
}
sub in_element {
my ($self, $name) = @_;
return ($self->{Names}[-1] eq $name);
}
sub within_element {
my ($self, $name) = @_;
my $count = 0;
foreach my $el_name (@{$self->{Names}}) {
$count ++ if ($el_name eq $name);
}
return $count;
}
1;
__END__
=head1 NAME
XML::Handler::Subs - a PerlSAX handler base class for calling user-defined subs
=head1 SYNOPSIS
use XML::Handler::Subs;
package MyHandlers;
use vars qw{ @ISA };
sub s_NAME { my ($self, $element) = @_ };
sub e_NAME { my ($self, $element) = @_ };
$self->{Names}; # an array of names
$self->{Nodes}; # an array of $element nodes
$handler = MyHandlers->new();
$self->in_element($name);
$self->within_element($name);
=head1 DESCRIPTION
C