<div dir="ltr"><div><div><div>Подобную задачу пытался на Moose решить недавно. Красивого способа не нашёл.<br></div>В итоге сделал конвертацию вручную перед записью в БД:<br><br>my $attr = $self->meta->get_attribute($field_name);<br>
if ( $attr->should_coerce ) {<br>    my $constraint = Moose::Util::TypeConstraints::find_type_constraint( 'DBField' );<br>    $new_value = $constraint->coerce($new_value);<br></div>}<br><br></div>Код не продакшн, больше для знакомства с Moose. Но вроде работал.<br>
</div><div class="gmail_extra"><br><br><div class="gmail_quote">24 сентября 2013 г., 22:24 пользователь Ivan Petrov <span dir="ltr"><<a href="mailto:i.petro.77.00@gmail.com" target="_blank">i.petro.77.00@gmail.com</a>></span> написал:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">имеется выборка из БД<br>
<br>
{<br>
    name => 'name',<br>
    point => '{ x: 1, y: 2 }'<br>
}<br>
<br>
далее класс<br>
<br>
package Point;<br>
use Mouse;<br>
require JSON::XS;<br>
<br>
has x   => is => 'ro', isa => 'Num';<br>
has y   => is => 'ro', isa => 'Num';<br>
<br>
sub jstr {<br>
    my ($class, $str) = @_;<br>
    my $json = JSON::XS->new->decode( $str );<br>
    return $class->new(x => $json->{x}, y => $json->{y});<br>
}<br>
<br>
package Obj;<br>
use Mouse;<br>
use Mouse::Util::TypeConstraints;<br>
<br>
coerce Point<br>
    => from 'Str',<br>
    => via sub { Point->jstr( $_) };<br>
<br>
has name    => is => 'rw', isa => 'Str';<br>
has point   => is => 'rw', isa => 'Point', coerce => 1;<br>
<br>
из БД в поле point приходит нераспакованный JSON.<br>
<br>
соответственно при помощи coerce мы его распаковываем прозрачно.<br>
выборку из БД просто кормим конструктору Obj.<br>
<br>
все красиво.<br>
<br>
а теперь как сделать красиво чтобы обратно в БД записать?<br>
<br>
<br>
кроме как сериализационный метод у Point есть какие-то<br>
варианты?<br>
<span class="HOEnZb"><font color="#888888">--<br>
Moscow.pm mailing list<br>
<a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" target="_blank">http://moscow.pm.org</a><br>
</font></span></blockquote></div><br><br clear="all"><br>-- <br>С уважением, Тимур Нозадзе
</div>