diff options
Diffstat (limited to 'lib/Config/AST/Node/Value.pm')
-rw-r--r-- | lib/Config/AST/Node/Value.pm | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/lib/Config/AST/Node/Value.pm b/lib/Config/AST/Node/Value.pm new file mode 100644 index 0000000..24dd18d --- /dev/null +++ b/lib/Config/AST/Node/Value.pm @@ -0,0 +1,47 @@ +package Config::AST::Node::Value; +use parent 'Config::AST::Node'; +use strict; +use warnings; + +sub new { + my $class = shift; + local %_ = @_; + my $v = delete $_{value}; + my $self = $class->SUPER::new(%_); + $self->value($v); + return $self; +} + +sub value { + my ($self, $val) = @_; + + if (defined($val)) { + $self->{_value} = $val; + return; # Avoid evaluatig value too early + } else { + $val = $self->{_value}; + } + + if (ref($val) eq 'CODE') { + $val = &$val; + } + + if (wantarray) { + if (ref($val) eq 'ARRAY') { + return @$val + } elsif (ref($val) eq 'HASH') { + return %$val + } + } + + return $val; +} + +sub is_leaf { 1 }; + +sub as_string { + my $self = shift; + return $self->value +} + +1; |