Al usar Moose, ¿es posible crear un generador que cree múltiples atributos a la vez?¿Cómo puedo crear múltiples atributos con un solo creador en Moose?
Tengo un proyecto en el que el objeto tiene varios 'conjuntos' de campos; si se solicita algún miembro del conjunto, deseo continuar y rellenarlos todos. Mi suposición es que si necesito el nombre, también necesitaré la fecha de nacimiento, y dado que están en la misma tabla, es más rápido obtener ambas en una consulta.
No estoy seguro de si mi pregunta es lo suficientemente clara, pero espero que algún código de muestra lo deje en claro.
lo que tengo:
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;
}
Pero lo que quiero decir:
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
}
Bonito patrón, pero si hay muchos atributos, ¿hay alguna manera de evitar repetirlo?: build => '_build_attribute1' ... sub _build_attribute1 {my $ self = cambio; return $ self-> raw_row -> {attribute1}; } ¿una y otra vez? Tal vez hay una forma para _build_attribute para identificar el atributo que lo llamó? – yahermann
@yahermann, creo que eso llega al punto del problema. Si pudieras hacer lo que sugieres, este problema no existiría. – UncleCarl