私は多くのレベルの深さの大きなハッシュを持っており、このハッシュを一連の Moose クラスに変換したいと考えています。
ハッシュは次のようになります。
my %hash = (
company => {
id => 1,
name => 'CorpInc',
departments => [
{
id => 1,
name => 'Sales',
employees => [
{
id => 1,
name => 'John Smith',
age => '30',
},
],
},
{
id => 2,
name => 'IT',
employees => [
{
id => 2,
name => 'Lucy Jones',
age => '28',
},
{
id => 3,
name => 'Miguel Cerveza',
age => '25',
},
],
},
],
}
);
Moose クラス:
package Company;
use Moose;
has 'id' => (is => 'ro', isa => 'Num');
has 'name' => (is => 'ro', isa => 'Str');
has 'departments' => (is => 'ro', isa => 'ArrayRef[Company::Department]');
1;
package Company::Department;
use Moose;
has 'id' => (is => 'ro', isa => 'Num');
has 'name' => (is => 'ro', isa => 'Str');
has 'employees' => (is => 'ro', isa => 'ArrayRef[Company::Person]');
1;
package Company::Person;
use Moose;
has 'id' => (is => 'ro', isa => 'Num');
has 'first_name' => (is => 'ro', isa => 'Str');
has 'last_name' => (is => 'ro', isa => 'Str');
has 'age' => (is => 'ro', isa => 'Num');
1;
このハッシュを Company オブジェクトに変換する最良の方法は何ですか?
これまでに検討したオプションは次のとおりです。
- %hash を手動でループし、最も深い「クラス」(例: Person) を見つけ、最初にこれらを作成してから、新しく作成されたより高いレベルのクラス (Department) にこれらを手動で追加します。
- 各クラスにある種の強制機能を追加すると、Company->new(%hash) のようなことができ、各クラスに独自の「サブクラス」を (強制によって) 作成させることができます。
- %hash を MooseX::Storage がシリアル化するものと同様の構造に変換し、MooseX::Storage を使用してすべてをインスタンス化します...
他のアイデアや提案はありますか?