В Moose, если роль определяет атрибут со значением по умолчанию, как мне изменить это значение по умолчанию в моем потребляющем классе?

Мой класс Moose потребляет роль, которую мне нельзя менять. Эта роль определяет атрибут со значением по умолчанию. Мне нужен мой класс, чтобы иметь этот атрибут, но с другим значением по умолчанию.

Это возможно?

Все, что я мог придумать, это окружить "новый" метод некоторым собственным кодом, как показано ниже:

around new => sub {
    my ($orig, $self) = (shift, shift);
    return $self->$orig(@_, the_attribute => $new_value);
}

Но я не уверен, что окружение нового действительно, и также надеялся на что-то более элегантное.

2 ответа

Решение

Лучше и проще написать это в своем классе:

has '+the_attribute' => (
    default => sub{1},
}

has с + позволяет переопределить только определенное свойство атрибута.

Гораздо проще, чем окружающие BUILDARGS.

У вас есть правильная идея, но вы не должны переопределять new, Moose:: Manual:: BestPractices говорит:

Никогда не отменять новый

Переопределение new это очень плохая практика. Вместо этого вы должны использовать BUILD или же BUILDARGS методы сделать то же самое. Когда вы переопределяете newMoose больше не может встроить конструктор, когда ваш класс обездвижен.

Прошло много времени с тех пор, как я это сделал, но я думаю, что следующее поможет.

around BUILDARGS => sub {
   my $orig  = shift;
   my $class = shift;
   return $self->$orig(
      the_attribute => $new_value,
      @_ == 1 ? %{ $_[0] } : @_,
   );
};

Заметки:

  • Сначала я поместил новый атрибут, чтобы он мог быть переопределен.
  • Я сделал так, чтобы оба ->new({ ... }) а также ->new(...) все еще работают. Вы могли бы использовать @_ вместо @_ == 1 ? %{ $_[0] } : @_ если тебя не волнует взлом ->new({ ... }),
Другие вопросы по тегам