#!/opt/bin/perl

use Getopt::Long;
use PApp::Env;

$unset = 0;

sub printval {
   my $val = shift;
   if (ref $val) {
      print "{$val}\n";
   } else {
      print "$val\n";
   }
}

Getopt::Long::Configure ("bundling", "no_ignore_case");

if (@ARGV) {
   GetOptions(
            "help|h" => sub {
               require Pod::Usage;
               Pod::Usage::pod2usage(1);
            },
            "unset|u" => sub {
               $unset = 1;
            },
            "eval|e" => sub {
               $eval = 1;
            },
            "<>" => sub {
               if ($_[0] =~ /^([^=]+)=(.*)$/s) {
                  my ($var, $val) = ($1, $2);
                  if ($eval) {
                     my $_val = $val;
                     $val = eval $_val;
                     die "$var=$_val: $@\n" if $@;
                  }
                  setenv $var, $val;
               } elsif ($unset) {
                  unsetenv $_[0];
               } else {
                  printval getenv $_[0];
               }
            },

   );
} else {
   for (listenv) {
      print "$_=";
      printval getenv($_);
   }
}

=head1 NAME

papp-env - get/set/clear/display environment variables

=head1 SYNOPSIS

   papp-env --help

List all environment variables in name=value format (I<warning>, might
contain binary data):

   papp-env

List the value of a single environment variable (I<without> trailing newline):

   papp-env myvar

Set some env-variables:

   papp-env var1=value1 var2=value2 "var3=value 3" var4="contains == equal!"

Unsetting instead of setting env-variables:
 
   papp-env -u var1 var2 var3

Combine almost all of the above:

   papp-env var=value printvar1 -u v2 v3 v4

Evaluate value as perl code rather than as strings:

   papp-env -e arrayvar="['val1', 'val2']" hashvar="{ a => 5, b => 7}"

=head1 DESCRIPTION

Not yet ;)

=head1 SEE ALSO

L<PApp>.

=head1 BUGS

- no handling of binary data or perl-structures

=head1 AUTHOR

 Marc Lehmann <pcg@goof.com>
 http://www.goof.com/pcg/marc/

=cut


