--- python/lib/python2.2/site-packages/quixote/publish.py	2003-11-11 17:32:21.000000000 +0100
+++ q-new/publish.py	2003-11-20 16:20:16.000000000 +0100
@@ -453,7 +453,38 @@
         # ...or a callable.
         elif callable(object):
             try:
-                output = object(request)
+                if hasattr(object.__call__, "func_code"):
+                    varnames=object.__call__.func_code.co_varnames
+                else:
+                    varnames=[]
+                if 'request' in varnames:
+                    args=[request]
+                else:
+                    args=[]
+                form={}
+                add_empty=[]
+                for key, value in request.form.items():
+                    if key.find(":save")!=-1:
+                        assert(key.endswith(":save"))
+                        add_empty.append(key[:-5])
+                        continue
+                    if key.endswith(":list"):
+                        print "list: %s %s" % (key, value)
+                        key=key[:-5]
+                        form[key]=value
+                    else:
+                        form[key]=value
+
+                # See Util.keywordInput
+                for empty in add_empty:
+                    old=form.get(empty)
+                    if not old:
+                        form[empty]=[]
+                    elif not (type(old) in [type(()), type([])]):
+                        assert(type(old)==type(""))
+                        form[empty]=[old]
+                        
+                output = apply(object, args, form)
             except SystemExit:
                 output = "SystemExit exception caught, shutting down"
                 self.log(output)
@@ -467,7 +498,7 @@
             raise RuntimeError(
                 "object is neither callable nor a string: %s" % repr(object))
 
-
+        output=self.finish_output(output, request, path)
         # The callable ran OK, commit any changes to the session
         self.finish_successful_request(request)
 
@@ -755,6 +786,11 @@
                           "be replaced by _q_lookup()" % type(container))
             object = container._q_getname(request, component)
         if object is None:
+            if hasattr(container, component):
+                raise errors.TraversalError(
+                    private_msg="object %r has attribute %r, but is not "
+                    "in _q_export list" % (
+                    container, component))
             raise errors.TraversalError(
                 private_msg="object %r has no attribute %r" % (
                                                     container,
