diff --git a/lib/camping-unabridged.rb b/lib/camping-unabridged.rb
index dbd4ee3..6a7b714 100644
--- a/lib/camping-unabridged.rb
+++ b/lib/camping-unabridged.rb
@@ -594,6 +594,12 @@ def qs_parse(qs, d = '&;')
# Parses a string of cookies from the Cookie header.
def kp(s); c = qs_parse(s, ';,'); end
+ def method_missing(m, c, *a)
+ k = X.const_get(c)
+ k.send :include, C, Base, Models
+ k.allocate.method(m, *a)
+ end
+
# Fields a request through Camping. For traditional CGI applications, the method can be
# executed without arguments.
#
@@ -626,11 +632,21 @@ def kp(s); c = qs_parse(s, ';,'); end
#
def run(r=$stdin,e=ENV)
k, a = Controllers.D un("/#{e['PATH_INFO']}".gsub(%r!/+!,'/'))
- k.send :include, C, Base, Models
+ i k
k.new(r,e,(m=e['REQUEST_METHOD']||"GET")).service(*a)
rescue Exception => x
Controllers::ServerError.new(r,e,'get').service(k,m,x)
end
+
+ def method_missing(m, c, *a)
+ k = Controllers.const_get(c)
+ i k
+ k.new(nil,H['HTTP_HOST','','SCRIPT_NAME','','HTTP_COOKIE',''],m.to_s).service(*a)
+ end
+
+ def i k
+ k.send(:include, C, Base, Models) if !(kURL(*a) end;def initialize r,e,m;e=H[e.to_hash]
-@status,@method,@env,@headers,@root=200,m.downcase,e,{'Content-Type'=>"text/htm\
-l"},e.SCRIPT_NAME.sub(/\/$/,'');@k=C.kp e.HTTP_COOKIE;q=C.qs_parse e.QUERY_STRING
-@in=r;if %r|\Amultipart/form-.*boundary=\"?([^\";,]+)|n.match e.CONTENT_TYPE;b=
+P="Cam\ping Problem!";module Helpers;def R c,*args;p=/\(.+?\)/;args.inject(c.
+urls.find{|x|x.scan(p).size==args.size}.dup){|str,a|str.sub(p,C.escape((a.
+__send__(a.class.primary_key)rescue a)))}end;def URL c='/',*a;c=R(c,*a)if c.
+respond_to?:urls;c=self/c;c="//"+@env.HTTP_HOST+c if c[/^\//];URI(c) end;def / p
+p[/^\//]?@root+p : p end;def errors_for o;ul.errors{o.errors.each_full{|x|li x}
+}if o.errors.any?end end;module Base;include Helpers;attr_accessor :input,
+:cookies,:env,:headers,:body,:status,:root;def method_missing m,*a,&b
+s=m==:render ? markaview(*a,&b):eval("markaby.#{m}(*a,&b)");s=markaview(:layout
+){s} if Views.method_defined?:layout;s end;def r s,b,h={};@status=s;@headers.
+merge! h;@body=b end;def redirect *a;r 302,'','Location'=>URL(*a)end;def
+initialize r,e,m;e=H[e.to_hash];@status,@method,@env,@headers,@root=200,m.
+downcase,e,{'Content-Type'=>"text/html"},e.SCRIPT_NAME.sub(/\/$/,'')
+@k=C.kp e.HTTP_COOKIE;q=C.qs_parse e.QUERY_STRING;@in=r
+if %r|\Amultipart/form-.*boundary=\"?([^\";,]+)|n.match e.CONTENT_TYPE;b=
/(?:\r?\n|\A)#{Regexp::quote("--#$1")}(?:--)?\r$/;until @in.eof?;fh=H[];for l in
@in;case l;when "\r\n":break;when /^Content-Disposition: form-data;/:fh.u H[*$'.
scan(/(?:\s(\w+)="([^"]+)")/).flatten];when /^Content-Type: (.+?)(\r$|\Z)/m;fh[
@@ -27,23 +27,26 @@ module Base;include Helpers;attr_accessor :input,:cookies,:env,:headers,:body,
|k,v|[*v].map{|x|"#{k}: #{x}"}}*"\r\n"}\r\n\r\n#{@body}" end;def markaby;Mab.new(
instance_variables.map{|iv|[iv[1..-1],instance_variable_get(iv)]}) end;def
markaview m,*a,&b;h=markaby;h.send m,*a,&b;h.to_s end end
-module Controllers;class NotFound;def get p;r(404,div{h1 P
+X=module Controllers;class NotFound;def get p;r(404,div{h1 P
h2 p+" not found"}) end end;class ServerError;include Base;def get k,m,e;r(500,
Mab.new{h1 P;h2 "#{k}.#{m}";h3 "#{e.class} #{e.message}:";ul{
e.backtrace.each{|bt|li(bt)}}}.to_s)end end;class<x;Controllers::ServerError.new(r,e,'get').service(
-k,m,x)end end;module Views;include Controllers,Helpers end;module Models;A=
+qs_parse(s,';,')end;def run r=$stdin,e=ENV;k,a=X.D un("/#{e['PATH_INFO']
+}".gsub(/\/+/,'/'));i k;k.new(r,e,(m=e['REQUEST_METHOD'
+]||"GET")).service *a;rescue Exception=>x;X::ServerError.new(r,e,'get').service(
+k,m,x)end;def method_missing m,c,*a;k=X.const_get c;i k;k.new('',
+H['HTTP_HOST','','SCRIPT_NAME','','HTTP_COOKIE',''],m.to_s).service *a;end
+def i k;k.send(:include,C,Base,Models)if !(k