Как вызвать несколько методов, определенных в компоненте Mason?

Есть два компонента: test.mc из мне нужно вызвать два метода, определенных в компоненте name.mi,

компонент /name.mi

<%class>
    has 'name';
</%class>

<%method text>
<pre>Some text here</pre>
</%method>

<%method showname>
NAME: <% $.name %>
</%method>

компонент /test.mc

<%init>
        my $namecomp = $m->load('name.mi', name=>'john');
</%init>
<% $namecomp->text %>
<% $namecomp->showname %>

Запуск /test.mc:

  • $namecomp->text метод РАБОТАЕТ.
  • $namecomp->showname НЕ работает, выдав эту ошибку:

Невозможно использовать строку ("MC0::name_mi") в качестве ссылки HASH, в то время как "строгие ссылки" используются в аксессоре MC0::name_mi::name (определено в /.../testpoet/comps/name.mi строка 2) строка 5

Вопросы:

  • Кто-нибудь может показать мне пример, как правильно использовать $m->load($path)?
  • почему не может получить доступ к $.name от showname method Итак, как вызвать несколько методов, определенных в name.mi составная часть?

например, при желании достичь чего-то, что в чистом Perl может (схематично) написать так:

package Myapp::Name;
has 'name';
method text() {
    print "some text";
}
method showname {
    print "Name: " . $self->name();
}

и использовать его как:

my $namecomp = Myapp::Name->new( name => 'John' );
$namecomp->text;
$namecomp->showname;

1 ответ

Решение

Использование construct вместо load

От perldoc Mason::Request:

   load (path)
       Makes the component path absolute if necessary, and calls Interp load
       to load the component class associated with the path.

...

   construct (path[, params ...])
       Constructs and return a new instance of the component designated by
       path params, if any, are passed to the constructor. Throws an error
       if path does not exist.

Load не вернет пригодный для использования объект, в то время как конструкция будет.

Следующее сработало для меня в /test.mc:

<%init>
        my $namecomp = $m->construct('name.mi', name=>'john');
</%init>
<% $namecomp->text %>
<% $namecomp->showname %>
Другие вопросы по тегам