使用Mason2构建网站。每个页面应该调用 3 个过滤器(方法,按内容调用):
<% $.filter1(args...) {{ %>
<% $.filter2(args...) {{ %>
<% $.filter3(args...) {{ %>
我对这些过滤器(方法)有 3 种不同的实现。这 3 个过滤器的默认设置是在顶级/Base.mc
组件中定义的。
现在,对于网站的不同部分 - (不同的路线),比如说
/a/all/paths>/...>
/b/.....
需要使用上面的默认过滤器/方法集,但对于其他路由,
/c/...
/d/...
/e/...
需要使用另一组filter1
, filter2
,filter3
和
/x/....
/y/...
想用第三套。
这些方法可以很容易地在较低级别的组件中重新定义,但是按照(this question)中的方式进行操作并不符合 DRY 原则,例如在每个
/c/Base.mc
/d/Base.mc
/e/Base.mc
需要重复相同的 3
<%override filter1>
...
<%override filter2>
...
<%override filter3>
问题是:
- 如何只编写一次方法的 3 种不同实现,以及如何一次使用它们?
我尝试制作一个组件,例如:/set2.mi
,,/set3.mi
我尝试覆盖那些过滤器方法,并在需要时调用/{c,d,e}/Base.mc
它
<& /set2.mi &>
但这不起作用。
如何编写 3 种不同的方法实现并在所需的 deeprr 中一次调用它们Base.mc
?可能吗?
在标准 perl 我可能会使用角色,所以在需要的包中我会使用类似的东西:
with 'Set1';
with 'Set2';
包Set1
和Set2
将包含所需方法的实现,或用于动态加载的地方将使用require ...
. 在 Mason2 中是否有可能,或者我必须重复%ovverride
?
希望这是有道理的......如果没有,请添加评论,我会尝试更新问题。
编辑
例如,为了缩短代码,只使用一个过滤器而不是 3。
这/Base.mc
<%augment wrap><% inner() %></%augment>
% #this is the "default" MyHead filter
<%filter MyHead($arg)>
<!-- in the real code it is more complicated, but for an illustration it is enough -->
<h1 class="<% $arg %>"><% $yield->() %></h1>
</%filter>
当在/a/index.mc
使用它作为
% $.MyHead('big') {{
some head text
% }}
将输出如下:
<h1 class="big">some head text</h1>
现在,再来一个MyHead
。
<%filter MyHead($arg)>
<!-- in the real code it is more complicated - basically want output different thing -->
<h2 id="<% $arg %>"><% $yield->() %></h2>
</%filter>
如果我将上面的代码添加到我的/b/Base.mc
它将工作,并MyHead
在/b/index.mc
% $.MyHead('modal') {{
some other text
% }}
将调用重新定义的过滤器,并将输出我想要的
<h2 id="modal">some other text</h2>
问题是,
- 我不想在其他N个
Base.mc
组件中重复上面的过滤代码,比如in/c/Base.mc
等/d/Base.mc
。 - 如何实现,编写一次过滤器并在许多其他组件中“使用”它以“重新定义”默认值。