diff --git a/lib/camping.rb b/lib/camping.rb
index a2f0562..d03b80b 100644
--- a/lib/camping.rb
+++ b/lib/camping.rb
@@ -11,45 +11,42 @@ def method_missing m,*a;m.to_s=~/=$/?self[$`]=a[0]:a==[]?self[m.to_s]:super end
p[0]==?/?@root+p:p end;def URL c='/',*a;c=R(c, *a) if c.respond_to?:urls
c=self/c;c=@request.url[/.{8,}?(?=\/)/]+c if c[0]==?/;URI c end
end;module Base;attr_accessor:input,:cookies,:headers,:body,:status,:root
+M=proc{|_,o,n|o.merge(n,&M)}
def render v,*a,&b;mab(/^_/!~v.to_s){send(v,*a,&b)} end
def mab l=nil,&b;m=Mab.new({},self);s=m.capture(&b)
s=m.capture{layout{s}} if l && m.respond_to?(:layout);s end
def r s,b,h={};b,h=h,b if Hash===b;@status=s;
@headers.merge!(h);@body=b;end;def redirect *a;r 302,'','Location'=>URL(*a).
-to_s;end;def r404 p=env.PATH;r 404,P%"#{p} not found"end;def r500 k,m,x
-r 500,P%"#{k}.#{m}"+"
#{x.class} #{x.message}: #{x.
-backtrace.map{|b|"- #{b}
"}}
"end;def r501 m=@method
-r 501,P%"#{m.upcase} not implemented"end;def to_a
-@response.body=@body.respond_to?(:each)?@body:""
-@response.status=@status;@response.headers.merge!(@headers)
+to_s;end;def r404 p;P%"#{p} not found"end;def r500 k,m,e;raise e;end
+def r501 m;P%"#{m.upcase} not implemented"end;def to_a
+r=Rack::Response.new(@body,@status,@headers)
@cookies.each{|k,v|v={:value=>v,:path=>self/"/"} if String===v
-@response.set_cookie(k,v) if @request.cookies[k]!=v}
-@response.to_a;end;def initialize(env)
-@request,@response,@env=Rack::Request.new(env),Rack::Response.new,env
-@root,@input,@cookies,@headers,@status=
-(@env.SCRIPT_NAME||'').sub(/\/$/,''),H[@request.params],
-H[@request.cookies],@response.headers,@response.status
-@input.each{|k,v|if k[-2..-1]=="[]";@input[k[0..-3]]=
-@input.delete(k)elsif k=~/(.*)\[([^\]]+)\]$/
-(@input[$1]||=H[])[$2]=@input.delete(k)end};end;def service *a
-r=catch(:halt){send(@env.REQUEST_METHOD.downcase,*a)};@body||=r
+r.set_cookie(k,v)}
+r.to_a;end;def initialize(env,m)
+r=@request=Rack::Request.new(@env=env)
+@root,p,@cookies,@headers,@status,@method=
+(env.SCRIPT_NAME||'').sub(/\/$/,''),H[r.params],
+H[r.cookies],{},m=~/r(\d+)/?$1.to_i: 200,m
+@input=p.inject(H[]){|h,(k,v)|h.merge k.split(/[\]\[]+/).reverse.inject(v){|x,i|
+H[i=>x]},&M};end;def service *a
+r=catch(:halt){send(@method,*a)};@body||=r
self;end;end;module Controllers;@r=[];class<'(\d+)',"X"=>'(\w+)',"Index"=>''
+N=H.new{|_,x|x.downcase}.merge! "N"=>'(\d+)',"X"=>'([^/]+)',"Index"=>''
def M;def M;end;constants.map{|c|k=const_get(c)
k.send:include,C,Base,Helpers,Models;@r=[k]+r if r-[k]==r
k.meta_def(:urls){["/#{c.scan(/.[^A-Z]*/).map(&N.method(:[]))*'/'}"]
-}if !k.respond_to?:urls}end end;class IStringIO.new,'REQUEST_METHOD'=>m.to_s})
-k=X.const_get(c).new(H[e]);k.send("input=",h[:input])if h[:input]
+}if !k.respond_to?:urls}end end;I=R()
+end;X=Controllers;class<e).to_a;end
+def method_missing m,c,*a;X.M;h=Hash===a[-1]?a.pop: {}
+e=H[Rack::MockRequest.env_for('',h[:env]||{})]
+k=X.const_get(c).new(e,m.to_s);k.send("input=",h[:input])if h[:input]
k.service(*a);end;end;module Views;include X,Helpers end;module Models
autoload:Base,'camping/ar';def Y;self;end end;autoload:Mab,'camping/mab';C end