require 'rubygems'
require 'parse_tree'
require 'sexp'
class UnboundMethod

def binding_class
@class_name || @class_name = begin
to_s =~ /\#\<UnboundMethod\:\s(\w+)/
Object.const_get($1)
end
end

def name
@name || @name = begin
to_s =~ /\#\<UnboundMethod\:\s\w+\#(\w+)/
$1.freeze
end
end

def parameters
@parameters || @parameters = begin
params, sexp = [], Sexp.from_array(ParseTree.new.parse_tree_for_method(binding_class, name))
sexp.each_of_type(:args) {|a| params = a.sexp_body.to_a }
params
end
end

end

class Application < Merb::Controller

def self.inherited(base)
super
memo = Hash.new() { |h,k| h[k] = base::instance_method(k).parameters }
base.instance_variable_set("@parameters_for_action", memo)
end

def self.parameters_for_action(action)
@parameters_for_action[action]
end

def call_action(action)
send(action, *self.class::parameters_for_action(action).map { |name| params[name] })
end

end