HTML::FormHandlerを使用しています。field_name_space
それを使用するには、それからサブクラス化することを想定しており、 orなどのいくつかの属性をオーバーライドできますattribute_name_space
。
ただし、現在、すべてが拡張されているフォーム、HTML::FormHandler
またはその DBIC ベースのバリアントHTML::FormHandler::Model::DBICが多数あるため、これらのオーバーライドされた属性が何度も繰り返されています。
それらをロールに入れようとしましたが、+attr
ロールでは表記がサポートされていないというエラーが表示されます。けっこうだ。
この繰り返しをなくす最善の方法は何ですか? おそらくサブクラス化を考えましたが、 と に対して 2 回実行する必要がありますHTML::FormHandler
。HTML::FormHandler::Model::DBIC
さらに、サブクラス化は通常、代わりに Roles を使用したほうがよいというのが一般的な考えだと思います。
更新:例を挙げるのは良い考えだと思いました。これは私が現在行っていることであり、コードの繰り返しが含まれます。ご覧のとおり、1 つのフォームが別の親クラスを使用しているため、属性オーバーライドを入れるために 1 つの親クラスを作成することはできません。2 つ作成する必要があり、冗長性も追加されます。
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');
...