[Moscow.pm] Moose, передача аргументов "по умолчанию" через import

Konstantin S. Uvarin khedin на gmail.com
Пн Дек 28 05:46:21 PST 2015


Если я правильно понимаю, import в такой ситуации вызовется после has, а не
до, поэтому default в приведённом примере продолбается.

Я бы делал тогда уж

use Moose;
our %defaults;
sub import { shift; %defaults = @_ if @_ };
has foo => is => "rw", default => sub { $defaults{foo} };

(Тут, понятное дело, 100500 проверок опущены, это псевдокод по сути, но он
рабочий). Или как альтернатива - сделать

sub BUILD {
    my $self = shift;
    foreach (keys %defaults) {
         $self->{$_} ||= $defaults{$_};
    };
};

Выглядит пострашнее, но работать вроде быстрее должно (хотя кто его знает,
муз - надо бенчмарк делать).

Но здесь возникает новая засада - а если модуль поюзан из разных мест, и
там разные defaults?

Т.е.

package Foo;
use MyDefaults foo => exp(1); # e
.......
package Bar;
use MyDefaults foo => 4*atan2(1,1); #pi
......
package Baz;
use Foo;
use Bar;

И вот если вызовы Foo и Bar переставить, то результаты выполнения программы
вызовут много слов на е... и пи... у того, кто это сделает.

Так что я бы, наверное, ещё бы ругался на второй вызов import с непустыми
параметрами.


2015-12-28 15:05 GMT+02:00 Dmitry L. <dim0xff at gmail.com>:

> Привет!
>
> Задача - передавать в Moose объект значения атрибутов по-умолчанию
> через аргументы import:
>
> use MyModule default_var1 => 123;
>
>
> Подскажите, на сколько верно такое решение
> https://gist.github.com/dim0xff/b40880664e62a71442b7 ?
>
> Спасибо!
>
> --
> //wbr, Dmitry L.
> --
> Moscow.pm mailing list
> moscow-pm at pm.org | http://moscow.pm.org
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20151228/b677ad47/attachment.html>


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