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 )