2 # Rack::Builder implements a small DSL to iteratively construct Rack
7 # app = Rack::Builder.new {
8 # use Rack::CommonLogger
9 # use Rack::ShowExceptions
12 # run Rack::Lobster.new
18 # app = Rack::Builder.app do
19 # use Rack::CommonLogger
20 # lambda { |env| [200, {'Content-Type' => 'text/plain'}, 'OK'] }
23 # +use+ adds a middleware to the stack, +run+ dispatches to an application.
24 # You can use +map+ to construct a Rack::URLMap in a convenient way.
27 def initialize(&block
)
29 instance_eval(&block
) if block_given
?
33 self.new(&block
).to_app
36 def use(middleware
, *args
, &block
)
37 @ins << lambda
{ |app
| middleware
.new(app
, *args
, &block
) }
41 @ins << app
#lambda { |nothing| app }
45 if @ins.last
.kind_of
? Hash
46 @ins.last
[path
] = self.class.new(&block
).to_app
54 @ins[-1] = Rack
::URLMap.new(@ins.last
) if Hash
=== @ins.last
56 @ins[0...-1].reverse
.inject(inner_app
) { |a
, e
| e
.call(a
) }