--- /dev/null
+<html>
+
+<head>
+<title>plpinfo()</title>
+<style>
+ body {background:#FFF; color:#000; font-family:sans-serif}
+ table, h1 {width:45em; margin:1ex auto}
+ table, h1 {border:1px solid #000; border-collapse:collapse}
+ tr {background:#CCC; color:#000}
+ th, td {text-align:left; vertical-align:baseline}
+ th, td, h1 {padding:0.1ex 0.2em}
+ th {background:#CCF; width:33%}
+ h1 {font-size:150%; width:30em; background:#99C; color:#000}
+ h2 {font-size:125%; text-align:center}
+ i {color:#666}
+</style>
+</head>
+
+<body>
+<h1>PLP Version <:= $PLP::VERSION :></h1>
+
+<table border="1">
+<:
+use Config;
+printf "<tr><th>%s</th><td>%s</td></tr>\n", @$_ for (
+ ["System" => qx(uname -snrvm)],
+ ["Server API" => "CGI/FastCGI - ".$PLP::interface], #TODO
+ ["Perl" => join ".", map ord, split //, $^V],
+ ["Build Date" => $Config{cf_time}],
+ ["Debug Build" => $^P ? "yes" : "no"],
+ ["Thread Safety" => $Config{usethreads} ? "enabled" : "disabled"],
+ ["Include Path" => join "; ", @INC],
+);
+:></table>
+
+<h2>PLP Core</h2>
+
+<table border="1">
+<:
+my %modules;
+s!/!::!g, s/\.pm$// and $modules{$_} = $_->VERSION || "" for keys %INC;
+printf "<tr><th>%s</th><td>%s</td></tr>\n", @$_ for (
+ ["Modules" => join "<br>\n",
+ map "$_ $modules{$_}", sort grep /^PLP/, keys %modules
+ ],
+ ["Debug Output" => join "; ",
+ $PLP::DEBUG & 1 ? "run-time errors" : (),
+ $PLP::DEBUG & 2 ? "headers" : (),
+ ],
+ ["Caching" => $PLP::use_cache ? "on" : "off"], #TODO
+);
+:></table>
+
+<h2>Environment</h2>
+
+<table border="1">
+<:
+s/(?<=,)/<wbr>/g for values %ENV; # allow breaks at commas (HTTP_ACCEPT*)
+printf("<tr><th>%s</th><td>%s</td></tr>\n",
+ $_, defined $ENV{$_} ? $ENV{$_} : "<i>no value</i>"
+) for sort keys %ENV;
+:></table>
+
+<h2>PLP Variables</h2>
+
+<table border="1">
+<:
+for my $var qw(get post cookies header) {
+ printf("<tr><th>%s{'%s'}</th><td>%s</td></tr>\n",
+ $var, $_, defined $$var{$_} ? $$var{$_} : "<i>no value</i>"
+ ) for sort keys %$var;
+}
+:></table>
+
+</body>
+</html>