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

Dmitry Karasik dmitry на karasik.eu.org
Вт Сен 24 12:10:18 PDT 2013


если как бд используется DBIx::Class, у него есть 2хсторонние средства inflate/deflate,
достаточно красиво

/dk

On Tue, Sep 24, 2013 at 10:24:55PM +0400, Ivan Petrov wrote:
> имеется выборка из БД
> 
> {
>     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 mailing list
> moscow-pm на pm.org | http://moscow.pm.org

-- 
Sincerely,
	Dmitry Karasik



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