[caracas-pm] Extensiones ResultSet y load_namespaces DBIx::Class
Alejandro Imass
ait at p2ee.org
Mon Jul 23 07:40:35 PDT 2012
Buenos días,
Existen dos mecanismos saludables para extender las clases generadas
por DBIx::Class::Schema::Loader
1) Extender las clases Result directamente debajo del checksum
2) Crear un directorio ResultSet paralelo a Result y crear clases con
el mismo nombre que deriven de DBIx::Class::ResultSet y dejar que
load_namespaces cargue las dos clases.
Yo tengo tiempo usando el (2) sin embargo hay cosas que nunca he
terminado de comprender bien y opino que el detalle del mecanismo no
está muy documentado así que la idea es escuchar opiniones de otros
usuarios a ver si mejoro algunas cosas en mi código que no me gustan.
Uno tiende a pensar que load_namespaces debería combinar los métodos
extendidos pero realmente no es así. En realidad lo único que hace es
cargar las clases extendidas en ResultSet y asociarlas a la clase de
Result pero realmente no hace mucho más que eso y siempre me ha
parecido un poco limitado en ese sentido:
Ejemplo:
# tabla.pm creada por Loader depositada en Result
package ns::Schema::Result::tabla;
use base 'DBIx::Class::Core';
...
# tabla.pm creada por mi en ResultSet
package ns::Schema::ResultSet::tabla;
use base 'DBIx::Class::ResultSet';
sub foo {
my $self = shift;
}
...
$objeto = $schema->resultset('tabla')->find(1);
# esto NO funciona:
$objeto->foo();
# sino la forma de usarlo es así:
$schema->resultset('tabla')->foo();
El $self que recibe la clase ResultSet es de si misma (obviamente) y
no del $objeto por ende generalmente uno termina haciendo:
$schema->resultset('tabla')->foo($objeto);
Y la clase extendida termina siendo algo como:
# tabla.pm creada por mi en ResultSet
package ns::Schema::ResultSet::tabla;
use base 'DBIx::Class::ResultSet';
sub foo {
my $self = shift;
my $tabla = shift;
}
...
Me parece realmente limitante y con el tiempo me he puesto a estudiar
esto más a fondo a ver si comprendo bien la filosofía que está detrás
de este mecanismo de "extensión" porque lo más lógico sería que
$objeto->foo funcionara directo y el $self fuese de $objeto y no de
una instancia de la clase ResultSet.
La pregunta es: existe alguna forma de configurarlo de tal manera de
combinar las dos _instancias_, o sencillamente la filosofía de usar
este mecanismo es mantener las cosas separadas de esta forma??
Me parece que debería resolver los métodos, o amenos que una instancia
"vea" a la otra ya que si uno inspecciona dentro de una instancia de
la clase de Result ($objeto en el ejemplo arriba) se puede observar
que hay un atributo llamado resultset_class que apunta a la _clase_
creada en ResultSet pero yo no he logrado que las instancias como tal
se vean. Lo mínimo que debería proveer EMHO es una referencia de una
instancia a la otra, es decir que hubiese acceso a la instancia de
Result desde la instancia de ResultSet o vice versa.
Saludos,
--
Alejandro Imass
More information about the caracas-pm
mailing list