
use strict ;

package DefaultClient ;

use vars qw( @ISA ) ;
use XML::Parser::Notifier::SimpleDispatcher ;
@ISA = qw(XML::Parser::Notifier::SimpleDispatcher) ;

sub Init {
    my $self = shift ;
    $self -> _rules( { 
        '#start' => \&generic_start,
        '#cont' => sub { shift, shift ; $self -> {value_} = [@_] }
    } ) ; 
}

sub Final { @{$_[0] -> {value_}} }

sub generic_start {
    my ($self, $gi) = (shift, shift) ;
    my $atts = {@_} ;
    my $list = [] ;
    return {
        '#char' => sub { push @$list, $_[1] },
        '#cont' => sub { shift, shift ; push @$list, @_ },
        '#end' =>  sub {
            return { '#GI' => $gi, '#AT' => $atts, '#CO' => $list }
        },
        '#start' => \&generic_start
    }
}

package main ;

use Data::Dumper ;
use XML::Parser::Notifier ;
eval {
    print Dump Data::Dumper [
        XML::Parser::Notifier -> new( ) 
            -> add_client( new DefaultClient )
            -> parse(\*DATA)
    ] ;
} ;
print $@ if $@ ;
__DATA__
<foo bar="baz"> <bar baz="foo"> <baz foo="bar"> blah </baz> </bar> </foo>

