[bcn-pm] En un objecte, fer servir el varlor d'un atribut per crear dinàmicament els altres atributs

Miquel Ruiz self a miquelruiz.net
dis gen 12 04:05:36 PST 2013


El 12/01/2013 11:53, mimosinnet escribió:
> En aquest sentit, seria possible que els atributs
> dels objectes es definissin dinàmicament? És a dir, que un objecte
> tingues un número d'atributs diferents en diferents situacions? Per
> exemple, que els atributs fossin els noms d'arxiu d'un directori, i que
> aquests atributs variessin en funció del directori? A priori diria que
> la resposta és 'no'.

Sí que es pot, gràcies a Moose::Meta::Class. Un exemple molt tonto:

##############################################

#!/usr/bin/env perl

use 5.010;
use strict;
use warnings;

use Moose;
use Data::Dump;

# Get a list of files from /sys
my @files = split /\s+/, `ls /sys`;

# Class generation
my $meta = Moose::Meta::Class->create('Sys');

# One attribute per subdirectory in /sys
$meta->add_attribute($_ => (is => 'ro')) for @files;

# This is optional, just to put in place some optimizations
$meta->make_immutable;

# populate each attribute with an arrayref with the contents of the dir
my @args  = map { $_ => [ split /\s+/, `ls /sys/$_` ] } @files;

my $sys = $meta->new_object(@args);

# For instance
dd $sys->kernel;

##############################################

Tot i que jo probablement no faria servir aquest enfoc...

Pensa que per obtenir quins són els attributs d'aquesta classe hauràs 
d'extreure el llistat de directoris una altra vegada, el que pot donar 
lloc a incomptables race conditions i molt de dolor i sufriment a l'hora 
de fer debugging...

Però com a exercici de tot el que pot fer la metaclass, està molt bé ;)

Salut!!

-- 
Miquel Ruiz


Més informació sobre la llista de correu Barcelona-pm