implementation by peterv, classinfo changes by me, r/sr=me on peterv's changes, r/sr=peterv on my changes, r=caillon on the whole thing, sr=jst git-svn-id: svn://10.0.0.236/trunk@148006 18797224-902f-48f8-a5cc-f745e15eee43