(wizardry|games|hackery)
that Generator employs. It is
also similar to [mod://XML::Toolkit] because it generates classes
for XML. However, one XML file generates one class with
XML::Writer::Compiler. XML::Toolkit generates one class per tag within
a file. Also XML::Toolkit is class-based and refinement would be done
via numerous subclasses of each XML element. In XML::Compiler::Writer,
one subclass with several methods for various parts of the XML are all
that is needed.
Another similar module is [mod://XML::Toolkit] by [perigrin]. This
compiles a single XML file to a series of [mod://Moose] classes. I
experimented with this module early on. Personally I think a series of
methods in a single class might be more appropriate for programmatic
control of a single XML file. [perigrin] somewhat agrees with me
because we have both compared
[mod://DBIx::Class], which is object-based, with all other ORMS which
are limited by being class-based. (The ORM-talk is relevant because me
and [perigrin] both agree that XML::Toolkit is the
[mod://DBIx::Class::Loader] of XML).
Also, I found it to be quite verbose for
even a simple XML example. Perhaps a compiler-compiler could have
allowed for simpler usage. For instance to generate this XML:
you need this XML::Toolkit:
my $document = MyApp::Note->new(
to_collection => [MyApp::To->new(text => 'Bob')],
from_collection => [MyApp::From->new(text => 'Alice')],
headings => [MyApp::Heading->new(text => 'Secret' )],
body_collection => [MyApp::Body->new(text=>'Shh!')],
)
but only this much XML::Element::Tolol
my %data = ( to => 'Bob',
from => 'Alice',
heading => 'Secret',
Body => 'Shhh!'
);
MyApp::Note->new(data => \%data)->tree->as_XML;
In other words, one data definition, one constructor call and one
method class versus no data definition, 5 constructor calls.
my %data = ( george => [ { age => 45} , 'some content' ] );
my %data = ( george => 'some content' ] );
my %attr = ( george => {age 45 });
I think I like the former approach better.
# call the superclass to render the simple data in the hashref
my $lol = do {
local $self->{data} = \%tmpdata;
super();
};
# now rewrite part of the loltree with repetition
my @newlol;
for my $invoice_line ( @{$array_rows_for_single_invoice} ) {
my $aref = [
InvoiceLineAdd =>
[ ItemRef => [ ListID => $invoice_line->{product_listid} ] ],
[ Amount => $invoice_line->{amount} ],
];
push @newlol, $aref;
}
my ($dump) = rmap_array {
if ( $_->[0] eq 'InvoiceAdd' ) {
use List::MoreUtils qw(first_index);
my $i = first_index { ref $_ and $_->[0] eq 'SetCredit' } @$_;
splice @$_, ++$i, 1, @newlol;
# No need to drill down any further
cut($_);
}
else {
$_;
}
}
$lol;