<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -1,3 +1,12 @@
+= 1.0 / unreleased
+
+ * Route handlers, before filters, templates, error mappings, and
+   middleware are now resolved dynamically up the inheritance hierarchy
+   when needed instead of duplicating the superclass's version when
+   a new Sinatra::Base subclass is created. This should fix a variety
+   of issues with extensions that need to add any of these things
+   to the base class.
+
 = 0.9.2 / 2009-05-18
 
  * This version is compatible with Rack 1.0. [Rein Henrichs]</diff>
      <filename>CHANGES</filename>
    </modified>
    <modified>
      <diff>@@ -606,17 +606,28 @@ module Sinatra
       }.map! { |line| line.gsub(/^\.\//, '') }
     end
 
-    @routes     = {}
-    @filters    = []
-    @conditions = []
-    @templates  = {}
-    @middleware = []
-    @errors     = {}
-    @prototype  = nil
-    @extensions = []
-
     class &lt;&lt; self
-      attr_accessor :routes, :filters, :conditions, :templates, :errors
+      attr_reader :routes, :filters, :templates, :errors
+
+      def reset!
+        @conditions = []
+        @routes     = {}
+        @filters    = []
+        @templates  = {}
+        @errors     = {}
+        @middleware = []
+        @prototype  = nil
+        @extensions = []
+      end
+
+      # Extension modules registered on this class and all superclasses.
+      def extensions
+        if superclass.respond_to?(:extensions)
+          (@extensions + superclass.extensions).uniq
+        else
+          @extensions
+        end
+      end
 
       # Middleware used in this class and all superclasses.
       def middleware
@@ -793,7 +804,7 @@ module Sinatra
 
         invoke_hook(:route_added, verb, path, block)
 
-        (routes[verb] ||= []).
+        (@routes[verb] ||= []).
           push([pattern, keys, conditions, block]).last
       end
 
@@ -836,10 +847,6 @@ module Sinatra
         include(*extensions) if extensions.any?
       end
 
-      def extensions
-        (@extensions + (superclass.extensions rescue [])).uniq
-      end
-
       def register(*extensions, &amp;block)
         extensions &lt;&lt; Module.new(&amp;block) if block_given?
         @extensions += extensions
@@ -898,7 +905,6 @@ module Sinatra
         builder.use Rack::CommonLogger    if logging?
         builder.use Rack::MethodOverride  if methodoverride?
         builder.use ShowExceptions        if show_exceptions?
-
         middleware.each { |c,a,b| builder.use(c, *a, &amp;b) }
 
         builder.run super
@@ -909,17 +915,6 @@ module Sinatra
         synchronize { prototype.call(env) }
       end
 
-      def reset!(base=superclass)
-        @routes     = {}
-        @templates  = {}
-        @conditions = []
-        @filters    = []
-        @errors     = {}
-        @middleware = []
-        @prototype  = nil
-        @extensions = []
-      end
-
     private
       def detect_rack_handler
         servers = Array(self.server)
@@ -934,7 +929,7 @@ module Sinatra
       end
 
       def inherited(subclass)
-        subclass.reset! self
+        subclass.reset!
         super
       end
 
@@ -977,6 +972,8 @@ module Sinatra
       end
     end
 
+    reset!
+
     set :raise_errors, true
     set :dump_errors, false
     set :clean_trace, true</diff>
      <filename>lib/sinatra/base.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>f974af4c03c9dc0eb439a4c29a2236715157c6c6</id>
    </parent>
  </parents>
  <author>
    <name>Ryan Tomayko</name>
    <email>rtomayko@gmail.com</email>
  </author>
  <url>http://github.com/cylence/sinatra/commit/f75bee5acdc9a2da14e3605b49f6b61f94da7fa8</url>
  <id>f75bee5acdc9a2da14e3605b49f6b61f94da7fa8</id>
  <committed-date>2009-06-07T04:15:21-07:00</committed-date>
  <authored-date>2009-03-26T10:26:09-07:00</authored-date>
  <message>Cleanup and refactoring after inheritance changes</message>
  <tree>60aa31e4b14fa2a025d3e3e098f2a59787a3e2b3</tree>
  <committer>
    <name>Ryan Tomayko</name>
    <email>rtomayko@gmail.com</email>
  </committer>
</commit>
