]> git.sesse.net Git - xml-template/blob - perl-sax/XML/TemplateSAX/Buffer.pm
use strict, use warnins. Glah!
[xml-template] / perl-sax / XML / TemplateSAX / Buffer.pm
1 #! /usr/bin/perl
2
3 # A utility class that can store SAX events and replay them back to some SAX
4 # handler as many times as you'd like. Useful for both cloning and including.
5
6 use strict;
7 use warnings;
8 package XML::TemplateSAX::Buffer;
9 use base qw(XML::SAX::Base);
10
11 sub new {
12         my $class = shift;
13         my $ptr = shift;
14
15         my $self = {
16                 events => [],
17                 ptr => $ptr
18         };
19         bless($self, $class);
20         return $self;
21 }
22
23 sub start_element {
24         my ($self, $data) = @_;
25         push @{$self->{'events'}}, [ 'E', $data ];
26 }
27
28 sub characters {
29         my ($self, $data) = @_;
30         push @{$self->{'events'}}, [ 'C', $data ];
31 }
32
33 sub comment {
34         my ($self, $data) = @_;
35         push @{$self->{'events'}}, [ 'c', $data ];
36 }
37
38 sub processing_instruction {
39         my ($self, $data) = @_;
40         push @{$self->{'events'}}, [ 'p', $data ];
41 }
42
43 sub end_element {
44         my ($self, $data) = @_;
45         push @{$self->{'events'}}, [ 'e', $data ];
46 }
47
48 sub replay {
49         my ($self, $dest) = @_;
50
51         for my $event (@{$self->{'events'}}) {
52                 my ($type, $data) = @$event;
53                 if ($type eq 'E') {
54                         $dest->start_element($data);
55                 } elsif ($type eq 'C') {
56                         $dest->characters($data);
57                 } elsif ($type eq 'c') {
58                         $dest->comment($data);
59                 } elsif ($type eq 'p') {
60                         $dest->processing_instruction($data);
61                 } elsif ($type eq 'e') {
62                         $dest->end_element($data);
63                 }
64         }
65 }
66
67 1;