[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