En utilisant Moose, est-il possible de créer un générateur qui construit plusieurs attributs à la fois?Comment puis-je créer plusieurs attributs avec un seul constructeur dans Moose?
J'ai un projet dans lequel l'objet a plusieurs 'ensembles' de champs - si un membre de l'ensemble est demandé, je veux aller de l'avant et les peupler tous. Mon hypothèse est que si j'ai besoin du nom, j'ai aussi besoin de la date de naissance, et comme ils sont dans la même table, il est plus rapide d'avoir les deux en une seule requête.
Je ne suis pas sûr si ma question est assez claire, mais j'espère que certains exemples de code le rendront clair.
Ce que je:
Package WidgetPerson;
use Moose;
has id => (is => 'ro', isa => 'Int');
has name => (is => 'ro', lazy => 1, builder => '_build_name');
has birthdate => (is => 'ro', lazy => 1, builder => '_build_birthdate');
has address => (is => 'ro', lazy => 1, builder => '_build_address');
sub _build_name {
my $self = shift;
my ($name) = $dbh->selectrow_array("SELECT name FROM people WHERE id = ?", {}, $self->id);
return $name;
}
sub _build_birthdate {
my $self = shift;
my ($date) = $dbh->selectrow_array("SELECT birthdate FROM people WHERE id = ?", {}, $self->id);
return $date;
}
sub _build_address {
my $self = shift;
my ($date) = $dbh->selectrow_array("SELECT address FROM addresses WHERE person_id = ?", {}, $self->id);
return $date;
}
Mais ce que je veux est:
has name => (is => 'ro', isa => 'Str', lazy => 1, builder => '_build_stuff');
has birthdate => (is => 'ro', isa => 'Date', lazy => 1, builder => '_build_stuff');
has address => (is => 'ro', isa => 'Address', lazy => 1, builder => '_build_address');
sub _build_stuff {
my $self = shift;
my ($name, $date) = $dbh->selectrow_array("SELECT name, birthdate FROM people WHERE id = ?", {}, $self->id);
$self->name($name);
$self->birthdate($date);
}
sub _build_address {
#same as before
}
Beau motif, mais s'il y a beaucoup d'attributs, existe-t-il un moyen d'éviter de répéter: build => '_build_attribute1' ... sub _build_attribute1 {my $ self = shift; return $ self-> raw_row -> {attribut1}; } encore et encore? Peut-être qu'il existe un moyen pour _build_attribute d'identifier l'attribut qui l'a appelé? – yahermann
@yahermann, je pense que cela va au point de la question. Si vous pouviez faire ce que vous suggérez, ce problème n'existerait pas. – UncleCarl