Если я правильно понимаю, 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. <[email protected]>:

> Привет!
>
> Задача - передавать в Moose объект значения атрибутов по-умолчанию
> через аргументы import:
>
> use MyModule default_var1 => 123;
>
>
> Подскажите, на сколько верно такое решение
> https://gist.github.com/dim0xff/b40880664e62a71442b7 ?
>
> Спасибо!
>
> --
> //wbr, Dmitry L.
> --
> Moscow.pm mailing list
> [email protected] | http://moscow.pm.org
>
-- 
Moscow.pm mailing list
[email protected] | http://moscow.pm.org

Ответить