Mercurial > pub > Impl
comparison lib/IMPL/Config/YAMLConfig.pm @ 421:7798345304bc ref20150831
working on IMPL::Config, removed old stuff
| author | cin | 
|---|---|
| date | Sun, 16 Jul 2017 22:59:39 +0300 | 
| parents | bbc4739c4d48 | 
| children | b0481c071bea | 
   comparison
  equal
  deleted
  inserted
  replaced
| 420:df591e3afd10 | 421:7798345304bc | 
|---|---|
| 3 | 3 | 
| 4 use IMPL::lang qw(:base); | 4 use IMPL::lang qw(:base); | 
| 5 use IMPL::Exception(); | 5 use IMPL::Exception(); | 
| 6 use YAML::XS(); | 6 use YAML::XS(); | 
| 7 | 7 | 
| 8 sub Load { | 8 use IMPL::declare { | 
| 9 my ( $this, $container, $file ) = @_; | 9 require => { | 
| 10 ReferenceDescriptor => 'IMPL::Config::ReferenceDescriptor', | |
| 11 ServiceDescriptor => 'IMPL::Config::ServiceDescriptor', | |
| 12 ValueDescriptor => 'IMPL::Config::ValueDescriptor' | |
| 13 }, | |
| 14 base => [ | |
| 15 'IMPL::Object' => undef | |
| 16 ], | |
| 17 props => [ | |
| 18 container => 'ro' | |
| 19 ] | |
| 20 }; | |
| 10 | 21 | 
| 11 $this->Configure( isscalar($file) | 22 sub CTOR { | 
| 12 ? YAML::XS::Load( ${$file} ) | 23 my ( $this, $container ) = @_; | 
| 13 : YAML::XS::LoadFile($file) ); | 24 die IMPL::InvalidArgumentException('container') | 
| 25 unless $container; | |
| 26 $this->container($container); | |
| 27 } | |
| 28 | |
| 29 sub LoadConfiguration { | |
| 30 my ( $this, $file ) = @_; | |
| 31 | |
| 32 $this->Configure( | |
| 33 isscalar($file) | |
| 34 ? YAML::XS::Load( ${$file} ) | |
| 35 : YAML::XS::LoadFile($file) | |
| 36 ); | |
| 14 } | 37 } | 
| 15 | 38 | 
| 16 sub Configure { | 39 sub Configure { | 
| 17 my ( $this, $container, $config ) = @_; | 40 my ( $this, $config ) = @_; | 
| 18 | |
| 19 | |
| 20 | 41 | 
| 42 die IMPL::InvalidArgumentException('config') | |
| 43 unless ishash($config); | |
| 44 | |
| 45 my $container = $this->container; | |
| 46 foreach my $item ( @{ $this->ParseServices( $config->{services} ) } ) { | |
| 47 $container->Register( $item->{role}, $item->{descriptor} ); | |
| 48 } | |
| 49 | |
| 50 return $container; | |
| 51 } | |
| 52 | |
| 53 sub ParseServices { | |
| 54 my ( $this, $services ) = @_; | |
| 55 | |
| 56 return $services | |
| 57 ? [ | |
| 58 map { | |
| 59 { | |
| 60 role => delete $_->{name}, | |
| 61 descriptor => $this->ParseDescriptor($_) | |
| 62 }; | |
| 63 } @$services | |
| 64 ] | |
| 65 : undef; | |
| 66 } | |
| 67 | |
| 68 sub ParseDescriptor { | |
| 69 my ( $this, $data ) = @_; | |
| 70 | |
| 71 my %opts = ( onwer => $this->container() ); | |
| 72 | |
| 73 if ( my $type = $data->{'$type'} ) { | |
| 74 $opts{services} = $this->ParseServices( $data->{services} ); | |
| 75 $opts{type} = $type; | |
| 76 $opts{args} = $this->ParseDescriptor( $data->{params} ) | |
| 77 if $data->{params}; | |
| 78 $opts{norequire} = $data->{norequire}; | |
| 79 $opts{activation} = $data->{activation}; | |
| 80 | |
| 81 return ServiceDescriptor->new(%opts); | |
| 82 } | |
| 83 elsif ( my $dep = $data->{'$ref'} ) { | |
| 84 $opts{services} = $this->ParseServices( $data->{services} ); | |
| 85 $opts{lazy} = $data->{lazy}; | |
| 86 $opts{optional} = $data->{optional}; | |
| 87 $opts{default} = $this->ParseDescriptor( $data->{default} ) | |
| 88 if exists $data->{default}; | |
| 89 | |
| 90 return ReferenceDesriptor->new( $dep, %opts ); | |
| 91 } | |
| 92 elsif ( my $value = $data->{'$value'} ) { | |
| 93 my ( $parsed, $raw ) = $this->ParseValue($value); | |
| 94 $opts{services} = $this->ParseServices( $data->{services} ); | |
| 95 $opts{raw} = $raw; | |
| 96 return ValueDescriptor->new( $parsed, %opts ); | |
| 97 } | |
| 98 else { | |
| 99 my ( $parsed, $raw ) = $this->ParseValue($value); | |
| 100 $opts{raw} = $raw; | |
| 101 return ValueDescriptor->new( $parsed, %opts ); | |
| 102 } | |
| 103 } | |
| 104 | |
| 105 sub ParseValue { | |
| 106 my ( $this, $value ) = @_; | |
| 107 | |
| 108 my $raw = 1; | |
| 109 | |
| 110 if ( ishash($value) ) { | |
| 111 return ( $this->ParseDescriptor($value), 0 ) | |
| 112 if grep exists $value->{$_}, qw($type $ref $value); | |
| 113 | |
| 114 my %res; | |
| 115 while ( my ( $k, $v ) = each %$value ) { | |
| 116 my ( $parsed, $flag ) = $this->ParseValue($v); | |
| 117 $res{$k} = $parsed; | |
| 118 $raw &&= $flag; | |
| 119 } | |
| 120 return ( \%res, $raw ); | |
| 121 } | |
| 122 elsif ( isarray($value) ) { | |
| 123 return ( | |
| 124 [ | |
| 125 map { | |
| 126 my ( $parsed, $flag ) = $this->ParseValue($_); | |
| 127 $raw &&= $flag; | |
| 128 return $parsed; | |
| 129 } @$value | |
| 130 ], | |
| 131 $raw | |
| 132 ); | |
| 133 } | |
| 134 else { | |
| 135 return ($value, 1); | |
| 136 } | |
| 21 } | 137 } | 
| 22 | 138 | 
| 23 1; | 139 1; | 
| 24 | 140 | 
| 25 __END__ | 141 __END__ | 
| 26 | 142 | 
| 27 =pod | 143 =pod | 
| 28 | 144 | 
| 145 =head1 NAME | |
| 146 | |
| 147 =head1 SYNOPSIS | |
| 148 | |
| 149 = | |
| 29 | 150 | 
| 30 =cut | 151 =cut | 
