[Moscow.pm] Mouse: обратный coerce

Ivan Petrov i.petro.77.00 на gmail.com
Вт Сен 24 11:24:55 PDT 2013


имеется выборка из БД

{
    name => 'name',
    point => '{ x: 1, y: 2 }'
}

далее класс

package Point;
use Mouse;
require JSON::XS;

has x   => is => 'ro', isa => 'Num';
has y   => is => 'ro', isa => 'Num';

sub jstr {
    my ($class, $str) = @_;
    my $json = JSON::XS->new->decode( $str );
    return $class->new(x => $json->{x}, y => $json->{y});
}

package Obj;
use Mouse;
use Mouse::Util::TypeConstraints;

coerce Point
    => from 'Str',
    => via sub { Point->jstr( $_) };

has name    => is => 'rw', isa => 'Str';
has point   => is => 'rw', isa => 'Point', coerce => 1;

из БД в поле point приходит нераспакованный JSON.

соответственно при помощи coerce мы его распаковываем прозрачно.
выборку из БД просто кормим конструктору Obj.

все красиво.

а теперь как сделать красиво чтобы обратно в БД записать?


кроме как сериализационный метод у Point есть какие-то 
варианты?


Подробная информация о списке рассылки Moscow-pm