XML-Toolkit

 view release on metacpan or  search on metacpan

lib/XML/Filter/Moose.pm  view on Meta::CPAN

package XML::Filter::Moose;
{
  $XML::Filter::Moose::VERSION = '0.15';
}
use Moose;
use namespace::autoclean;

use MooseX::NonMoose;

extends qw(XML::SAX::Base);

has stack => (
    isa        => 'ArrayRef',
    is         => 'ro',
    lazy_build => 1,
    clearer    => 'reset_stack',
    traits     => ['Array'],
    handles    => {
        'add_element'     => ['push'],
        'pop_element'     => ['pop'],
        'root'            => [ 'get', 0 ],
        'current_element' => [ 'get', -1 ],
        'stack_length'    => ['count'],
    }
);

sub _build_stack { [] }

has text => (
    isa       => 'Str',
    is        => 'rw',
    traits    => ['String'],
    lazy      => 1,
    clearer   => 'reset_text',
    predicate => 'has_text',
    default   => sub { '' },
    handles   => { append_text => 'append', },
);

has cdata => ( isa => 'Bool', is => 'rw', );

sub is_root { return shift->stack_length == 0 }

sub parent_element {
    my ($self) = @_;
    if ( $self->stack_length > 1 ) {
        return $self->stack->[-1];
    }
    $self->root;
}

sub start_document {
    my ( $self, $doc ) = @_;
    inner();
    $self->reset_stack;
}

sub start_element {
    my ( $self, $el ) = @_;
    inner();
    $self->add_element($el);
}

sub characters {
    my ( $self, $el ) = @_;
    inner();
    $self->append_text( $el->{Data} ) if $el->{Data} =~ /\S/;
}

sub end_element {
    my ( $self, $el ) = @_;
    inner();
    $self->pop_element;
    $self->reset_text;
}

sub end_document {
    my ( $self, $doc ) = @_;
    inner();
}

__PACKAGE__->meta->make_immutable;
1;
__END__

=head1 NAME

XML::Filter::Moose - A Moose-ified base class for XML::SAX 

=head1 VERSION

version 0.15

=head1 SYNOPSIS

    package MyFilter;
    use Moose
    extends qw(XML::SAX::Base);

    augment start_element => start {



( run in 1.970 second using v1.01-cache-2.11-cpan-39bf76dae61 )