Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer
 
PerlMonks  

XML::Simple + Moose

by jeffa (Chancellor)
on Apr 27, 2009 at 15:39 UTC ( #760371=note: print w/ replies, xml ) Need Help??


in reply to XML::Simple + Class::MethodMaker

I have been recently playing around with Moose. Here's an example that performs the same task but this time with Moose and coercion.

#!/usr/bin/perl package Instrument; use Moose; has name => ( is => 'rw', isa => 'Str' ); package Beatle; use Moose; use Moose::Util::TypeConstraints; subtype 'Instruments' => as 'ArrayRef'; coerce 'Instruments' => from 'ArrayRef' => via { [ map Instrument->new( name => $_ ), @$_ ] }; has name => ( is => 'rw', isa => 'Str' ); has instruments => ( is => 'rw', isa => 'Instruments', coerce => 1 ); sub plays { map $_->name, @{ shift->instruments } } package main; use XML::Simple; my $xml = XMLin( \*DATA, KeyAttr => [] ); for (@{ $xml->{beatle} }) { my $beatle = Beatle->new( %$_ ); print $beatle->name, ":\n"; print "\t$_\n" for $beatle->plays; } __DATA__ <beatles> <beatle name="Paul"> <instruments>Voice</instruments> <instruments>Bass</instruments> <instruments>Guitar</instruments> <instruments>Piano</instruments> </beatle> <beatle name="John"> <instruments>Voice</instruments> <instruments>Guitar</instruments> <instruments>Rhodes</instruments> </beatle> <beatle name="George"> <instruments>Voice</instruments> <instruments>Guitar</instruments> <instruments>Sitar</instruments> </beatle> <beatle name="Ringo"> <instruments>Voice</instruments> <instruments>Drums</instruments> <instruments>Percussion</instruments> </beatle> </beatles>

Class::MM requires less code, but Moose offers better encapsulation and type constraints. The tricky part about getting this example to work is dealing with coercion. The neat part here is that there is an implicit notion of a container class for the Instruments, but there is no actual class needed to contain "Instruments."

jeffa

L-LL-L--L-LL-L--L-LL-L--
-R--R-RR-R--R-RR-R--R-RR
B--B--B--B--B--B--B--B--
H---H---H---H---H---H---
(the triplet paradiddle with high-hat)


Comment on XML::Simple + Moose
Download Code

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://760371]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others studying the Monastery: (7)
As of 2014-09-23 08:47 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    How do you remember the number of days in each month?











    Results (212 votes), past polls