RJS callback functions fun

I was struck by the fact that there doesn't seem to be a way to use RJS to install a callback. For example:

page.visual_effect :slideup, @dom_id, :afterFinish => XXXXX

I want the XXXXX to be more RJS code. I don't want to have to revert back to Javascript! But that seems the only solution. What if I have a bunch of DOM manipulation I have do after I have slide the area up? What I want is something like:

page.visual_effect :slideup, @dom_id, :afterFinish => page.function {|p|
  p.replace_html 'foo', 'Bar'
  p.show 'baz'
}

So I took a stab at implementing Javascript functions via RJS. The below implementation allows you to define a anonymous function which is returned as a string. Or you can give the function a name (and possible some argument names) and you get to define a named function (although I haven't really tested this as I really only need anonymous functions for callbacks). I welcome feedback and hope this is useful to someone else.

module ActionView
module Helpers
module PrototypeHelper
class JavaScriptGenerator
   module GeneratorMethods
     # Will create a function using the block as the defination for the
     # function. If the function is given a name then it will be recorded
     # to the page under the name given. If a name is not given then
     # an anonymous function is instead created as a string and returned.
     # nothing is recorded to the page. This allows your function to be
     # used as a callback such as in :after_finish on a visual_effect.
     def function(name=nil, *arg_names, &blk)

     # Run block to collect lines
     sub_gen = JavaScriptGenerator.new @context, &blk
     body = sub_gen.instance_variable_get("@lines") * ";#{$/}\t"

     # For line from block execution
     line = "function #{name}(#{arg_names.collect(&:to_s).join ', '
  }) {#{$/}\t#{body}#{$/}}"

     name ? record(line) : line
   end
end