written by David Nichols
david@qore.org
