<div dir="ltr"><div>>> если как бд используется DBIx::Class, у него есть 2хсторонние средства inflate/deflate,</div><div>>></div><div>> Если, то, наверное да. :) Но это уже решение на уровне DBIx::Class, а не на уровне Moose/Mouse. </div>

<div>></div><div><br></div><div>Так это и есть правильный вариант.</div><div>Каждый сторейдж реализует запись и восстановление так, как ему это не обходимо. Кому-то нужен JSON, кому-то YAML, а кому-то вообще Storable. Понапихать в класс всех возможных сериализаторов и восстановляторов - для базы, для файла, для сети, etc - конечно можно, но имхо это менее православный метод. </div>

<div><br></div><div>Тем более, что в DBIx::Class для этого есть специальный компонент:</div><div><a href="http://search.cpan.org/dist/DBIx-Class/lib/DBIx/Class/InflateColumn.pod">http://search.cpan.org/dist/DBIx-Class/lib/DBIx/Class/InflateColumn.pod</a><br>

</div><div><br></div><div>И классические примеры создания своих компонентов на основе InflateColumn:</div><div><a href="http://cpansearch.perl.org/src/RIBASUSHI/DBIx-Class-0.08250/lib/DBIx/Class/InflateColumn/DateTime.pm">http://cpansearch.perl.org/src/RIBASUSHI/DBIx-Class-0.08250/lib/DBIx/Class/InflateColumn/DateTime.pm</a><br>

</div><div><a href="http://cpansearch.perl.org/src/BRICAS/DBIx-Class-DateTime-Epoch-0.10/lib/DBIx/Class/DateTime/Epoch.pm">http://cpansearch.perl.org/src/BRICAS/DBIx-Class-DateTime-Epoch-0.10/lib/DBIx/Class/DateTime/Epoch.pm</a><br>

</div><div><br></div><div>И кстати, при реализации inflate & deflate - никто ж не запрещает использовать уже имеющиеся в (Moose-derived) классе конструкторы и методы.</div><div><br></div><div class="gmail_extra"><br>
<br>
<div class="gmail_quote">24 сентября 2013 г., 22:11 пользователь Тимур Нозадзе <span dir="ltr"><<a href="mailto:timur.nozadze@gmail.com" target="_blank">timur.nozadze@gmail.com</a>></span> написал:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

<div dir="ltr"><div>Для меня вообще было вопросом, как сделать нормальную запись полей в БД. Т. е. вот есть объект, часть полей он достаёт из базы, часть — ещё откуда-то. Как сделать, чтобы при апдейте поля через сеттер новое значение автоматом попадало в базу (причём только для нужных полей, тех, которые из базы достали)? Сеттеры при этом, конечно, хотелось иметь дефолтные, не определяя их явно в классе.<br>


<br></div>В итоге решил с помощью трейта, который как-то там хитро пытаеться влезть перед триггером и что-то сделать, но не могу сказать, что меня это решение вдохновляет. К тому же, оно, вроде бы, вешает отдельный кодреф для каждого поля.<div class="im">

<br>
<br><blockquote style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex" class="gmail_quote">если как бд используется DBIx::Class, у него есть 2хсторонние средства inflate/deflate,<br>

</blockquote>
</div><div>Если, то, наверное да. :) Но это уже решение на уровне DBIx::Class, а не на уровне Moose/Mouse. <br></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">24 сентября 2013 г., 22:59 пользователь Тимур Нозадзе <span dir="ltr"><<a href="mailto:timur.nozadze@gmail.com" target="_blank">timur.nozadze@gmail.com</a>></span> написал:<div>

<div class="h5"><br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><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> написал:<div>


<div><br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style: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><font color="#888888">--<br>
Moscow.pm mailing list<br>
<a href="mailto:moscow-pm@pm.org" target="_blank">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" target="_blank">http://moscow.pm.org</a><br>
</font></span></blockquote></div></div></div><span><font color="#888888"><br><br clear="all"><br>-- <br>С уважением, Тимур Нозадзе
</font></span></div>
</blockquote></div></div></div><div><div class="h5"><br><br clear="all"><br>-- <br>С уважением, Тимур Нозадзе
</div></div></div>
<br>--<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>
<br></blockquote></div><br><br clear="all"><div><br></div>-- <br>Sincerely yours,<br>Oleg Kostyuk (CUB-UANIC)
</div></div>