#
# Copyright (C) 1998, 1999 Ken MacLeod
# XML::Grove::Factory is free software; you can redistribute it and/or
# modify it under the same terms as Perl itself.
#
# $Id: Factory.pm,v 1.1 1999/09/03 21:41:00 kmacleod Exp $
#
use strict;
package XML::Grove::Factory;
sub grove_factory {
my $type = shift;
my $self = ($#_ == 0) ? { %{ (shift) } } : { @_ };
bless $self, $type;
return $self;
}
sub element_factory {
my $type = shift;
my $self = ($#_ == 0) ? { %{ (shift) } } : { @_ };
bless $self, 'XML::Grove::Factory_';
return $self;
}
sub element_functions {
my $type = shift;
my $prefix = shift;
my $package = caller;
foreach my $name (@_) {
my $eval_str = <<'EOF;';
package @PACKAGE@;
sub @NAME@ {
if (ref($_[0]) eq 'HASH') {
my $attributes = { %{(shift)} };
return XML::Grove::Element->new( Name => '@NAME@',
Attributes => $attributes,
Contents => XML::Grove::Factory::chars_(@_) );
} else {
return XML::Grove::Element->new( Name => '@NAME@',
Contents => XML::Grove::Factory::chars_(@_) );
}
}
EOF;
$eval_str =~ s'@PACKAGE@'$package'ge;
$eval_str =~ s'@NAME@'$name'ge;
eval $eval_str;
die $@ if ($@);
}
}
sub document {
my $self = shift;
return XML::Grove::Document->new( Contents => chars_(@_) );
}
sub element {
my $self = shift;
my $name = shift;
if (ref($_[0]) eq 'HASH') {
my $attributes = { %{(shift)} };
return XML::Grove::Element->new( Name => $name,
Attributes => $attributes,
Contents => chars_(@_) );
} else {
return XML::Grove::Element->new( Name => $name,
Contents => chars_(@_) );
}
}
sub pi {
my $self = shift;
if ($#_ == 0) {
my $data = shift;
return XML::Grove::PI->new( Data => $data );
} else {
my $target = shift;
my $data = shift;
return XML::Grove::PI->new( Target => $target,
Data => $data );
}
}
sub comment {
my $self = shift;
my $comment = shift;
return XML::Grove::Comment->new( Data => $comment );
}
sub chars_ {
my $chars = [ ];
foreach my $obj (@_) {
if (ref $obj) {
push @$chars, $obj;
} else {
push @$chars, XML::Grove::Characters->new( Data => $obj );
}
}
return $chars;
}
package XML::Grove::Factory_;
use vars qw{ $AUTOLOAD };
sub AUTOLOAD {
my $self = shift;
my $name = $AUTOLOAD;
$name =~ s/.*:://;
return if $name eq 'DESTROY';
if (ref($_[0]) eq 'HASH') {
my $attributes = { %{(shift)} };
return XML::Grove::Element->new( Name => $name,
Attributes => $attributes,
Contents => XML::Grove::Factory::chars_(@_) );
} else {
return XML::Grove::Element->new( Name => $name,
Contents => XML::Grove::Factory::chars_(@_) );
}
}
1;
__END__
=head1 NAME
XML::Grove::Factory - simplify creation of XML::Grove objects
=head1 SYNOPSIS
use XML::Grove::Factory;
### An object that creates Grove objects directly
my $gf = XML::Grove::Factory->grove_factory;
$grove = $gf->document( CONTENTS );
$element = $gf->element( $name, { ATTRIBUTES }, CONTENTS );
$pi = $gf->pi( $target, $data );
$comment = $gf->comment( $data );
### An object that creates elements by method name
my $ef = XML::Grove::Factory->element_factory();
$element = $ef->NAME( { ATTRIBUTES }, CONTENTS);
### Similar to `element_factory', but creates functions in the
### current package
XML::Grove::Factory->element_functions( PREFIX, ELEMENTS );
$element = NAME( { ATTRIBUTES }, CONTENTS );
=head1 DESCRIPTION
C A paragraph.