I have an application server which I developed in 2001 using Tclhttpd. I was recently asked to add some new pages and update a few things (late 2005).
I'm using direct domains because I really like the way the form values are mapped into proc args. This makes handeling forms trivial. I also have my own home grown session/auth system since I didn't want HTTP Basic Auth and this was really broken back in 2001. I didn't use templates for these two reasons then and I don't see an easy way to use them now.
I got tired of restarting the server after each change to my application procs so I changed proc DirectDomain to look like this. The change is a little heavy handed (I rename proc to track the source files) but it works great.
rename proc _proc _proc proc { name args body } { set ::Source($name) [info script] set ::Source(.$name) [file mtime [info script]] _proc $name $args $body } proc DirectDomain {prefix sock suffix} { global Direct global env upvar #0 Httpd$sock data # Set up the environment a-la CGI. Cgi_SetEnv $sock $prefix$suffix # Source the command script? # if { [catch { puts "Check $::Source($prefix$suffix)" if { [file mtime $::Source($prefix$suffix)] != $::Source(.$prefix$suffix) } { puts "Sourcing $::Source($prefix$suffix)" source $::Source($prefix$suffix) } } reply] } { puts $reply } # Prepare an argument data from the query data. # Url_QuerySetup $sock set cmd [Direct_MarshallArguments $prefix $suffix] if {$cmd == ""} { Doc_NotFound $sock return } # Eval the command. Errors can be used to trigger redirects. set code [catch $cmd result] set type text/html upvar #0 $prefix$suffix aType if {[info exist aType]} { set type $aType } DirectRespond $sock $code $result $type }