我正在使用HTML::FormHandler。要使用它,应该从它继承子类,然后您可以覆盖一些属性,例如field_name_space
or attribute_name_space
。
但是,我现在有很多表单都在扩展HTML::FormHandler
或其基于 DBIC 的变体HTML::FormHandler::Model::DBIC,因此这些被覆盖的属性重复了很多次。
我试图将它们放在一个角色中,但得到一个错误,即+attr
角色中不支持符号。很公平。
消除这种重复的最佳方法是什么?我想也许是子类化,但后来我不得不为HTML::FormHandler
and做两次,而且HTML::FormHandler::Model::DBIC
我相信一般的想法是,子类化通常用 Roles 更好地实现。
更新:我认为举个例子是个好主意。这就是我目前正在做的事情——它涉及代码重复。如您所见,一种表单使用不同的父类,因此我无法创建一个父类来放置属性覆盖。我必须创建两个 - 这也增加了冗余。
package MyApp::Form::Foo;
# this form does not interface with DBIC
extends 'HTML::Formhandler';
has '+html_prefix' => (default => 1);
has '+field_traits' => (default => sub { ['MyApp::Form::Trait::Field'] });
has '+field_name_space' => (default => 'MyApp::Form::Field');
has '+widget_name_space' => (default => sub { ['MyApp::Form::Widget'] });
has '+widget_wrapper' => (default => 'None');
...
package MyApp::Form::Bar;
# this form uses a DBIC object
extends 'HTML::Formhandler::Model::DBIC';
has '+html_prefix' => (default => 1);
has '+field_traits' => (default => sub { ['MyApp::Form::Trait::Field'] });
has '+field_name_space' => (default => 'MyApp::Form::Field');
has '+widget_name_space' => (default => sub { ['MyApp::Form::Widget'] });
has '+widget_wrapper' => (default => 'None');
...
package MyApp::Form::Baz;
# this form also uses a DBIC object
extends 'HTML::Formhandler::Model::DBIC';
has '+html_prefix' => (default => 1);
has '+field_traits' => (default => sub { ['MyApp::Form::Trait::Field'] });
has '+field_name_space' => (default => 'MyApp::Form::Field');
has '+widget_name_space' => (default => sub { ['MyApp::Form::Widget'] });
has '+widget_wrapper' => (default => 'None');
...