SGML-Grove
view release on metacpan or search on metacpan
Simple/BuilderBuilder.pm view on Meta::CPAN
sub new {
my $type = shift;
return ($singleton)
if (defined $singleton);
my $self = {};
bless ($self, $type);
$singleton = $self;
return $self;
}
sub visit_SGML_Grove {
my $self = shift; my $grove = shift;
# XXX capture grove information to built object?
$grove->children_accept!gi! ($self, @_);
}
# XXX PI, entities?
EOFEOF
$str =~ s/!new_package!/$new_package/g;
$str =~ s/!super_package!/$super_package/g;
my $gi = $self->{'use_gi'} ? "_gi" : "";
$str =~ s/!gi!/$gi/g;
$self->eval_ ($str);
die "BuilderBuilder::visit_SGML_Simple_Spec: unable to compile rule\n"
. "$str\n$@\n"
if $@;
}
sub eval_ {
my $self = shift;
my $str = shift;
if (defined $self->{'eval_output'}) {
if (ref $self->{'eval_output'} eq 'SCALAR') {
${$self->{'eval_output'}} .= $str;
} else {
$self->{'eval_output'}->print ($str);
}
return 0;
} else {
return (eval $str);
}
}
package NoSuchGI_;
use Carp;
use vars qw{$AUTOLOAD};
sub visit_scalar {
my $self = shift; my $scalar = shift; my $parent = shift;
if (ref ($scalar) =~ /::Iter/) {
$parent->push ($scalar->delegate);
} else {
# XXX cdata_mapper?
$parent->push ($scalar);
}
}
sub visit_SGML_SData {
my $self = shift; my $sdata = shift; my $parent = shift;
if (ref ($sdata) =~ /::Iter/) {
$parent->push ($sdata->delegate);
} else {
# XXX sdata_mapper?
$parent->push ($sdata);
}
}
sub AUTOLOAD {
my $self = shift; my $visited = shift;
my $obj = shift; my $context = shift;
my $type = ref($self)
or croak "$self is not an object";
my $name = $AUTOLOAD;
my ($class, $op);
$name =~ m/(.*)::(visit_gi_|visit_)?([^:]+)$/;
($class, $op, $name) = ($1, $2, $3);
return if ($name eq 'DESTROY'); # per perlbot(1)
if ($op eq 'visit_gi_' | $op eq 'visit_') {
if (!$context->{'not_handled'}{"$op$name"}) {
carp "$name not handled\n";
$context->{'not_handled'}{"$op$name"} = 1;
}
} else {
croak "$AUTOLOAD: huh?\n";
}
}
1;
( run in 0.826 second using v1.01-cache-2.11-cpan-39bf76dae61 )