view lib/IMPL/Config/ValueDescriptor.pm @ 427:09e0086a82a7 ref20150831 tip

Merge
author cin
date Tue, 15 May 2018 00:51:33 +0300
parents b0481c071bea
children
line wrap: on
line source

package IMPL::Config::ValueDescriptor;
use strict;

use IMPL::lang qw(:base);
use IMPL::declare {
    require => {
        Descriptor => 'IMPL::Config::Descriptor'
    },
    base => [
        'IMPL::Object' => undef,
        'Descriptor'   => undef
    ],
    props => [
        value    => 'rw',
        raw      => 'rw',
        services => 'rw'
    ]
};

sub CTOR {
    my ( $this, $value, %opts) = @_;

    $this->value($value);
    $this->raw($opts{raw}) if exists $opts{raw};
    $this->services($opts{services}) if exists $opts{services};
}

sub Activate {
    my ( $this, $context ) = @_;
    return $this->value if $this->raw;

    return $this->_ActivateValue( $this->value, $context );
}

sub _ActivateValue {
    my ( $this, $value, $context ) = @_;

    if ( is( $value, Descriptor ) ) {
        return $value->Activate($context);
    }
    elsif ( isarray($value) ) {
        return [ map $this->_ActivateValue( $_, $context ), @$value ];
    }
    elsif ( ishash($value) ) {
        return {
            map { $_, $this->_ActivateValue( $value->{$_}, $context ) }
              keys %$value
        };
    }
    else {
        return $value;
    }
}

sub GetName {
    return '$value: ' . shift->value;
}

1;