Perl — Rose::DB::Object::Loader + Rose::DB::Object::Helpers

Проблема - надо, чтобы в сгенерированные Rose::DB::Object::Loader классы были включены методы, заданные с помощью Rose::DB::Object::Helpers. Решение подсказали в http://www.mail-archive.com/rose-db-object@lists.sourceforge.net/msg01541.html:

The usual way is to create a common base class with all the helpers you
want, then tell the loader to use that class as the base_class.

http://search.cpan.org/dist/Rose-DB-Object/lib/Rose/DB/Object/Loader.pm#base_class

Пример - создаём базовый класс

package Rose::DB::Object::Baseclass;
use base qw(Rose::DB::Object);
use Rose::DB::Object::Helpers qw(as_tree as_json);
1;

и при генерации его указываем:

my $loader = Rose::DB::Object::Loader->new(
db_dsn => $db->{dsn},
db_username => $db->{user},
db_schema => $db->{user},
db_password => $db->{password},
db_options => $db->{opt},
class_prefix => 'Reestr::Rose',
base_class=>'Rose::DB::Object::Reestr',
);
$loader->make_classes;

И всё получается! Можно писать:

my $r = Reestr::Rose::Request->new( id => $c->param('id') );
$r->load();
$c->render_json($r->as_tree);

Это пример для Mojolicious. Если написать просто $c->render_json($r) , то будут сгенерировано бог знает что, так как Rose не очень здорово работает с пространствами имён, и в $r будет куча мусора - и данные из строки базы, и аксессоры, см. RESERVED_METHODS:

db dbh delete DESTROY error init_db _init_db insert load meta meta_class not_found save update

Leave a Reply