use JSON::PP;
package util;
  use base;
  $json = JSON::PP->new;
  $json->allow_nonref(1);

  sub prefix() {
    my ($self, $key) = (@_);
    return "tpl_".$key;
  }

  sub true {
    return JSON::PP::true;
  }

  sub false {
    JSON::PP::false;
  }

  sub string {
    my ($self, $key) = (@_);
    $key = $self->prefix($key);
    return $ENV{$key} || "";
  }

  sub integer {
    my ($self, $key) = (@_);
    my $value=$self->string($key);
    return int($value);
  }

  sub boolean {
    my ($self, $key) = (@_);
    my $value = $ENV{$self->prefix($key)} || "";
    return ( $value eq "true" ? JSON::PP::true : JSON::PP::false );
  }

  sub exists {
    my ($self, $key) = (@_);
    return defined($ENV{$self->prefix($key)});
  }

  sub parse {
    my ($self, $value) = (@_);
    return $json->decode($value);
  }

  sub length {
    my ($self, $key) = (@_);
    return int($ENV{$self->prefix($key."_length")});
  }

  sub array {
    my ($self, $key) = (@_);
    my $interpret = $self->boolean($key."_json");
    my $value;
    my $length = $self->length($key);
    @arr=();
    for ($_ = 0; $_ < $length; ++$_) {
      $value = $self->infer($key."_".$_);
      if($interpret) {
        $value = $self->parse($value);
      }
      #print "adding array value : $value\n";
      push(@arr,$value);
    }
    return \@arr;
  }

  sub infer {
    my ($self, $key) = (@_);
    my $value = $ENV{$self->prefix($key)};
    #print "key: $key\n";
    #print "value: $value\n";
    if($value eq "true" || $value eq "false") {
      return $self->boolean($key);
    }elsif($value eq "null") {
      return undef;
    }
    return $value;
  }
1;
