2016-11-12 6 views
1

BUILDARGSを使わずにhashrefから完全なオブジェクト階層を作成したいと思います。それを行うための可能な簡単な方法はありますか?BUILDARGSを使わずにperl Mooseで属性オブジェクトを自動的に作成

#!/usr/bin/perl 
use v5.14; 
use strict; 
use warnings; 
{ 
    package Obj1; 

    use v5.14; 
    use strict; 
    use warnings; 
    use Moose; 

    has 'backend' => (
     is   => 'ro', 
     isa   => 'Obj2', 
     required => 1, 
    ); 

    no Moose; 
    __PACKAGE__->meta->make_immutable; 

    1; 
} 
{ 
    package Obj2; 

    use v5.14; 
    use strict; 
    use warnings; 
    use Moose; 

    has 'flag' => (
     is   => 'ro', 
     isa   => 'Bool', 
     required => 1, 
    ); 

    no Moose; 
    __PACKAGE__->meta->make_immutable; 

    1; 
} 

my $data = { 
    backend => { 
     flag => 1 
    } 
}; 

my $s = Obj1->new($data); 
say $s->backend->flag; 

これまでのところ、私はBUILDARGSを使用していましたが、これはやや自動化できるでしょうか?ここでは簡単な例を示します。私のコードでは階層がより深いので、クラスごとにBUILDARGSを書くのを止めれば本当にうれしいでしょう。

答えて

3

型強制を使用できます。

  1. どこかのタイプと強制(ムースのベストプラクティスは、単一のモジュールであなたのタイプ定義のすべてを置くことをお勧めします)を定義:新しいタイプの定義に変更backend

    package My::Types; 
    use Moose::Util::TypeConstraints; 
    class_type 'Obj2Class', { class => 'Obj2' }; 
    coerce 'Obj2Class', from 'HashRef', via { Obj2->new($_) }; 
    
  2. をし、それが強制可能にします:

    use My::Types; 
    has backend => (
        is  => 'ro', 
        isa  => 'Obj2Class', 
        coerce => 1, 
        required => 1, 
    ); 
    

そして、それはそれでなければなりません。

関連する問題