Как вызвать несколько методов, определенных в компоненте 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 %>