Beefy Boxes and Bandwidth Generously Provided by pair Networks
Think about Loose Coupling
 
PerlMonks  

XML::Simple + Class::MethodMaker

by jeffa (Bishop)
on Aug 06, 2003 at 00:30 UTC ( #281231=CUFP: print w/replies, xml ) Need Help??

Inspired by the request over at hashes, arrays, and references... oh my (the gist is creating objects from XML), i wanted to create a "real" object - one that has accessor methods instead of relying on the client to access $self's reference directly. I also wanted to be able to specify those methods easily, and more importantly, be able to pass a hash to the constructor and have it assign all of the attributes for me. Enter Class::MethodMaker:
#!/usr/bin/perl -l package Beatle; use Class::MethodMaker new_hash_init => 'new', get_set => [qw(name instruments)], ; package main; use strict; use warnings; use XML::Simple; my $xml = XMLin(\*DATA, KeyAttr => []); for (@{$xml->{beatle}}) { my $beatle = Beatle->new(%$_); print $beatle->name, ":"; print "\t$_" for @{$beatle->instruments}; } __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>
Apologies to any Pete Best fans out there. ;)

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)

Replies are listed 'Best First'.
XML::Simple + Moose
by jeffa (Bishop) on Apr 27, 2009 at 15:39 UTC

    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)
    
Re: XML::Simple + Class::MethodMaker
by mildside (Friar) on Aug 06, 2003 at 03:12 UTC
    Very instructional & definitely cool! ++

    Cheers!

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: CUFP [id://281231]
Approved by antirice
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others about the Monastery: (8)
As of 2022-08-11 08:40 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found

    Notices?