<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>experimentation/experiments/inheritable_accessor.rb</filename>
    </added>
    <added>
      <filename>spec/public/core_ext/class_spec.rb</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -2,29 +2,100 @@ require &quot;rubygems&quot;
 require &quot;erubis&quot;
 
 module Erubis
+  module Basic::Converter
+    def add_tailchar(src, tailchar)
+    end
+    
+    def convert_input(src, input)
+      pat = @pattern
+      regexp = pat.nil? || pat == '&lt;% %&gt;' ? DEFAULT_REGEXP : pattern_regexp(pat)
+      pos = 0
+      is_bol = true     # is beginning of line
+      input.scan(regexp) do |indicator, code, tailch, rspace|
+        match = Regexp.last_match()
+        len  = match.begin(0) - pos
+        text = input[pos, len]
+        pos  = match.end(0)
+        ch   = indicator ? indicator[0] : nil
+        lspace = ch == ?= ? nil : detect_spaces_at_bol(text, is_bol)
+        is_bol = rspace ? true : false
+        add_text(src, text) if text &amp;&amp; !text.empty?
+        ## * when '&lt;%= %&gt;', do nothing
+        ## * when '&lt;% %&gt;' or '&lt;%# %&gt;', delete spaces iff only spaces are around '&lt;% %&gt;'
+        if ch == ?=              # &lt;%= %&gt;
+          rspace = nil if tailch &amp;&amp; !tailch.empty?
+          add_text(src, lspace) if lspace
+          add_expr(src, code, indicator)
+          add_text(src, rspace) if rspace
+        elsif ch == ?\#          # &lt;%# %&gt;
+          n = code.count(&quot;\n&quot;) + (rspace ? 1 : 0)
+          if @trim &amp;&amp; lspace &amp;&amp; rspace
+            add_stmt(src, &quot;\n&quot; * n)
+          else
+            add_text(src, lspace) if lspace
+            add_stmt(src, &quot;\n&quot; * n)
+            add_text(src, rspace) if rspace
+          end
+        elsif ch == ?%           # &lt;%% %&gt;
+          s = &quot;#{lspace}#{@prefix||='&lt;%'}#{code}#{tailch}#{@postfix||='%&gt;'}#{rspace}&quot;
+          add_text(src, s)
+        else                     # &lt;% %&gt;
+          if @trim &amp;&amp; lspace &amp;&amp; rspace
+            if respond_to?(:add_stmt2)
+              add_stmt2(src, &quot;#{lspace}#{code}#{rspace}&quot;, tailch)
+            else
+              add_stmt(src, &quot;#{lspace}#{code}#{rspace}&quot;)
+            end
+          else
+            add_text(src, lspace) if lspace
+            if respond_to?(:add_stmt2)
+              add_stmt2(src, code, tailch)
+            else
+              add_stmt(src, code)
+            end
+            add_text(src, rspace) if rspace
+          end
+        end
+      end
+      #rest = $' || input                        # ruby1.8
+      rest = pos == 0 ? input : input[pos..-1]   # ruby1.9
+      add_text(src, rest)
+    end
+    
+  end
+  
   module BlockAwareEnhancer
     def add_preamble(src)
       src &lt;&lt; &quot;_old_buf, @_erb_buf = @_erb_buf, ''; &quot;
+      src &lt;&lt; &quot;@_engine = 'erb'; &quot;
     end
-    
+
     def add_postamble(src)
       src &lt;&lt; &quot;\n&quot; unless src[-1] == ?\n      
-      src &lt;&lt; &quot;_ret = @_erb_buf; @_erb_buf = _old_buf; _ret.to_s\n&quot;
+      src &lt;&lt; &quot;_ret = @_erb_buf; @_erb_buf = _old_buf; _ret.to_s;\n&quot;
     end
-    
+
     def add_text(src, text)
-      src &lt;&lt; &quot; @_erb_buf &lt;&lt; '&quot; &lt;&lt; text &lt;&lt; &quot;'; &quot;
+      p escape_text(text)
+      src &lt;&lt; &quot; @_erb_buf.concat('&quot; &lt;&lt; escape_text(text) &lt;&lt; &quot;'); &quot;
     end
-    
+
     def add_expr_escaped(src, code)
-      src &lt;&lt; ' @_erb_buf &lt;&lt; ' &lt;&lt; escaped_expr(code) &lt;&lt; ';'
+      src &lt;&lt; ' @_erb_buf.concat(' &lt;&lt; escaped_expr(code) &lt;&lt; ');'
+    end
+    
+    def add_stmt2(src, code, tailch)
+      #src &lt;&lt; code &lt;&lt; ';'
+      src &lt;&lt; code
+      src &lt;&lt; &quot; ).to_s; &quot; if tailch == &quot;=&quot;
+      src &lt;&lt; ';' unless code[-1] == ?\n
     end
     
     def add_expr_literal(src, code)
-      unless code =~ /(do|\{)(\s*|[^|]*|)?\s*$/
-        src &lt;&lt; ' @_erb_buf &lt;&lt; (' &lt;&lt; code &lt;&lt; ').to_s;'
+      if code =~ /(do|\{)(\s*\|[^|]*\|)?\s*\Z/
+        src &lt;&lt; ' @_erb_buf.concat( ' &lt;&lt; code &lt;&lt; &quot;; &quot;
       else
-        src &lt;&lt; ' @_erb_buf &lt;&lt; ' &lt;&lt; code &lt;&lt; &quot;; &quot;
+        src &lt;&lt; ' @_erb_buf.concat((' &lt;&lt; code &lt;&lt; ').to_s);'
       end
     end
   end
@@ -46,11 +117,67 @@ class Context
   def hello
     &quot;Hello&quot;
   end
+  
+  def hello2
+    &quot;Hello&quot;
+  end
 
   def helper(&amp;blk)
     &quot;&lt;tag&gt;#{capture(&amp;blk)}&lt;/tag&gt;&quot;
   end
 end
 
-puts Erubis::BlockAwareEruby.new(&quot;Begin: &lt;%= helper do %&gt;Hello&lt;% end %&gt;&lt;% 3.times do %&gt;X&lt;% end %&gt;&lt;%= hello %&gt;&quot;).src
-p Erubis::BlockAwareEruby.new.process(&quot;Begin: &lt;%= helper do %&gt;Hello&lt;% end %&gt;&lt;% 3.times do %&gt;X&lt;% end %&gt;&lt;%= hello %&gt;&quot;, Context.new)
\ No newline at end of file
+# puts Erubis::BlockAwareEruby.new(&quot;Begin: &lt;%= helper do %&gt;Hello&lt;% 3.times do %&gt;X&lt;% end %&gt;&lt;% end %&gt;&lt;%= hello %&gt;&quot;).src
+# p Erubis::BlockAwareEruby.new.process(&quot;Begin: &lt;%= helper do %&gt;Hello&lt;%= 3.times do %&gt;X&lt;% end %&gt;&lt;% end %&gt;&lt;%= hello %&gt;&quot;, Context.new)
+
+def form_for(bar)
+  bar.to_s
+end
+
+class Foo
+end
+
+# _old_verbose, $VERBOSE = $VERBOSE, nil
+# Erubis::BlockAwareEruby.new(&quot;&lt;%= form_for :foo do %&gt;Hello&lt;% end %&gt;&quot;).def_method(Foo, :stuffs)
+# $VERBOSE = _old_verbose
+# require &quot;parse_tree&quot;
+require &quot;ruby_parser&quot;
+require &quot;ruby2ruby&quot;
+
+text = &lt;&lt;-END
+Pre. &lt;p&gt;&lt;%= form_for :field do %&gt;
+  Capturing
+&lt;% end =%&gt;
+
+&lt;% if true %&gt;Hello&lt;% end %&gt;
+&lt;% if false %&gt;Goodbye&lt;% end %&gt;
+END
+
+p Erubis::BlockAwareEruby.new(text).src
+p Erubis::BlockAwareEruby.new.process(text)
+
+__END__
+puts Erubis::BlockAwareEruby.new(&lt;&lt;-TEMPLATE).src
+&lt;ul id=&quot;nav&quot;&gt;
+  &lt;% @nav_items = [] %&gt;
+  &lt;% @nav_items &lt;&lt; nav_item('Home', url(:root)) %&gt;
+  &lt;% @nav_items &lt;&lt; nav_item('Messaging', url(:new_message)) if current_user.has_permission?('message.send') %&gt;
+  &lt;% if current_user.has_permission?('schedule.power_user') %&gt;
+    &lt;% @nav_items &lt;&lt; &quot;&lt;li&gt;\#{link_to('Schedule', 'https://belpark.net/schedule/pwrusr/', :popup =&gt; true)}&lt;/li&gt;&quot; %&gt;
+  &lt;% elsif current_user.has_permission?('schedule.view') %&gt;
+    &lt;% @nav_items &lt;&lt; nav_item('Schedule', 'https://belpark.net/schedule/user/calendar.php') %&gt;
+  &lt;% end %&gt;
+  &lt;% if current_user.emails.exists?([&quot;emails.address LIKE ?&quot;, '%@belpark.net']) %&gt;
+    &lt;% @nav_items &lt;&lt; &quot;&lt;li&gt;\#{link_to('Email', 'https://belpark.net/dwmail/', :popup =&gt; true)}&lt;/li&gt;&quot; %&gt;
+  &lt;% end %&gt;
+  &lt;% @nav_items &lt;&lt; nav_item('Directory', url(:users)) if current_user.has_permission?('user.view') %&gt;
+  &lt;%= @nav_items.join('&lt;li class=&quot;divider&quot;&gt;|&lt;/li&gt;') %&gt;
+&lt;/ul&gt;
+&lt;ul id=&quot;nav2&quot;&gt;
+  &lt;% @nav_items = [] %&gt;
+  &lt;% @nav_items &lt;&lt; &quot;&lt;li&gt;\#{current_user.full_name}&lt;/li&gt;&quot; %&gt;
+  &lt;% @nav_items &lt;&lt; &quot;&lt;li&gt;\#{link_to('Settings', url(:edit_user, current_user.id))}&lt;/li&gt;&quot; if current_user.has_permission?('user.modify_self') %&gt;
+  &lt;% @nav_items &lt;&lt; &quot;&lt;li&gt;\#{link_to 'Log Out', url(:logout), :id =&gt; 'logout'}&lt;/li&gt;&quot; %&gt;
+  &lt;%= @nav_items.join('&lt;li class=&quot;divider&quot;&gt;|&lt;/li&gt;') %&gt;
+&lt;/ul&gt;
+TEMPLATE
\ No newline at end of file</diff>
      <filename>experimentation/experiments/erubis.rb</filename>
    </modified>
    <modified>
      <diff>@@ -81,8 +81,8 @@ class Merb::AbstractController
   include Merb::RenderMixin
   include Merb::InlineTemplates
   
-  class_inheritable_accessor :_layout, :_template_root
-  class_inheritable_array :_before_filters, :_after_filters
+  class_inheritable_accessor :_layout, :_template_root, :template_roots
+  class_inheritable_accessor :_before_filters, :_after_filters
   
   FILTER_OPTIONS = [:only, :exclude, :if, :unless, :with]
 
@@ -144,13 +144,21 @@ class Merb::AbstractController
     template
   end
 
+  def self._template_root=(root)
+    @_template_root = root
+    _reset_template_roots
+  end
+
+  def self._reset_template_roots
+    self.template_roots = [[self._template_root, :_template_location]]
+  end
+
   # ==== Returns
   # roots&lt;Array[Array]&gt;::
   #   Template roots as pairs of template root path and template location
   #   method.
   def self._template_roots
-    read_inheritable_attribute(:template_roots) || 
-    write_inheritable_attribute(:template_roots, [[self._template_root, :_template_location]])
+    self.template_roots || _reset_template_roots
   end
 
   # ==== Parameters
@@ -158,7 +166,7 @@ class Merb::AbstractController
   #   Template roots as pairs of template root path and template location
   #   method.
   def self._template_roots=(roots)
-    write_inheritable_attribute(:template_roots, roots)
+    self.template_roots = roots
   end
   
   cattr_accessor :_abstract_subclasses, :_template_path_cache</diff>
      <filename>lib/merb-core/controller/abstract_controller.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,6 +1,9 @@
 class Merb::Controller &lt; Merb::AbstractController
 
   class_inheritable_accessor :_hidden_actions, :_shown_actions
+  self._hidden_actions ||= []
+  self._shown_actions ||= []
+  
   cattr_accessor :_subclasses, :_session_id_key, :_session_secret_key, :_session_expiry, :_session_cookie_domain
   self._subclasses = Set.new
 
@@ -75,26 +78,6 @@ class Merb::Controller &lt; Merb::AbstractController
       self._shown_actions = self._shown_actions | names.map {|n| n.to_s}
     end
 
-    # This list of actions that should not be callable.
-    #
-    # ==== Returns
-    # Array[String]:: An array of actions that should not be dispatchable.
-    def _hidden_actions
-      actions = read_inheritable_attribute(:_hidden_actions)
-      actions ? actions : write_inheritable_attribute(:_hidden_actions, [])
-    end
-
-    # This list of actions that should be callable.
-    #
-    # ==== Returns
-    # Array[String]::
-    #   An array of actions that should be dispatched to even if they would not
-    #   otherwise be.
-    def _shown_actions
-      actions = read_inheritable_attribute(:_shown_actions)
-      actions ? actions : write_inheritable_attribute(:_shown_actions, [])
-    end
-
     # The list of actions that are callable, after taking defaults,
     # _hidden_actions and _shown_actions into consideration. It is calculated
     # once, the first time an action is dispatched for this controller.</diff>
      <filename>lib/merb-core/controller/merb_controller.rb</filename>
    </modified>
    <modified>
      <diff>@@ -105,7 +105,7 @@ module Merb::RenderMixin
 
       template_method, template_location = 
         _template_for(thing, content_type, controller_name, opts[:template])
-      
+
       # Raise an error if there's no template
       unless template_method &amp;&amp; self.respond_to?(template_method)
         template_files = Merb::Template.template_extensions.map { |ext| &quot;#{template_location}.#{ext}&quot; }</diff>
      <filename>lib/merb-core/controller/mixins/render.rb</filename>
    </modified>
    <modified>
      <diff>@@ -134,9 +134,7 @@ module Merb
       #---
       # @public
       def provides(*formats)
-        formats.each do |fmt|
-          self.class_provided_formats &lt;&lt; fmt unless class_provided_formats.include?(fmt)
-        end
+        self.class_provided_formats |= formats
       end
       
       # This class should only provide the formats listed here, despite any
@@ -214,7 +212,6 @@ module Merb
       if @_content_type
         raise ContentTypeAlreadySet, &quot;Cannot modify provided_formats because content_type has already been set&quot;
       end
-      @_provided_formats = []
       provides(*formats)
     end
     alias :_provided_formats= :_set_provided_formats   
@@ -240,9 +237,8 @@ module Merb
       if @_content_type
         raise ContentTypeAlreadySet, &quot;Cannot modify provided_formats because content_type has already been set&quot;
       end
-      formats.each do |fmt|
-        _provided_formats &lt;&lt; fmt unless _provided_formats.include?(fmt)
-      end
+      @_provided_formats ||= [] 
+      @_provided_formats |= formats
     end
 
     # Sets list of provided formats for this particular request. Usually used</diff>
      <filename>lib/merb-core/controller/mixins/responder.rb</filename>
    </modified>
    <modified>
      <diff>@@ -19,7 +19,6 @@
 # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
-
 # Allows attributes to be shared within an inheritance hierarchy, but where
 # each descendant gets a copy of their parents' attributes, instead of just a
 # pointer to the same. This means that the child can add elements to, for
@@ -39,7 +38,7 @@ class Class
   def cattr_reader(*syms)
     syms.flatten.each do |sym|
       next if sym.is_a?(Hash)
-      class_eval(&lt;&lt;-EOS, __FILE__, __LINE__)
+      class_eval(&lt;&lt;-RUBY, __FILE__, __LINE__ + 1)
         unless defined? @@#{sym}
           @@#{sym} = nil
         end
@@ -51,7 +50,7 @@ class Class
         def #{sym}
           @@#{sym}
         end
-      EOS
+      RUBY
     end
   end
 
@@ -65,7 +64,7 @@ class Class
   def cattr_writer(*syms)
     options = syms.last.is_a?(Hash) ? syms.pop : {}
     syms.flatten.each do |sym|
-      class_eval(&lt;&lt;-RUBY, __FILE__, __LINE__)
+      class_eval(&lt;&lt;-RUBY, __FILE__, __LINE__ + 1)
         unless defined? @@#{sym}
           @@#{sym} = nil
         end
@@ -76,7 +75,7 @@ class Class
       RUBY
       
       unless options[:instance_writer] == false
-        class_eval(&lt;&lt;-RUBY, __FILE__, __LINE__)
+        class_eval(&lt;&lt;-RUBY, __FILE__, __LINE__ + 1)
           def #{sym}=(obj)
             @@#{sym} = obj
           end
@@ -110,22 +109,28 @@ class Class
   #   (error out or do the same as other methods above) instead of silently
   #   moving on). In particular, this makes the return value of this function
   #   less useful.
-  def class_inheritable_reader(*syms)
-    syms.each do |sym|
-      next if sym.is_a?(Hash)
-      class_eval &lt;&lt;-EOS, __FILE__, __LINE__
-
-        def self.#{sym}
-          read_inheritable_attribute(:#{sym})
-        end
-
-        def #{sym}
-          self.class.#{sym}
+  def class_inheritable_reader(*ivars)
+    instance_reader = ivars.pop[:reader] if ivars.last.is_a?(Hash)
+    
+    ivars.each do |ivar|
+      self.class_eval &lt;&lt;-RUBY, __FILE__, __LINE__ + 1
+        def self.#{ivar}
+          return @#{ivar} if self == #{self} || defined?(@#{ivar})
+          ivar = superclass.#{ivar}
+          return nil if ivar.nil? &amp;&amp; !#{self}.instance_variable_defined?(&quot;@#{ivar}&quot;)
+          @#{ivar} = ivar ? ivar.dup : ivar
         end
-      EOS
+      RUBY
+      unless instance_reader == false
+        self.class_eval &lt;&lt;-RUBY, __FILE__, __LINE__ + 1
+          def #{ivar}
+            self.class.#{ivar}
+          end
+        RUBY
+      end
     end
   end
-
+  
   # Defines class-level inheritable attribute writer. Attributes are available to subclasses,
   # each subclass has a copy of parent's attribute.
   #
@@ -138,83 +143,22 @@ class Class
   #
   # @todo We need a style for class_eval &lt;&lt;-HEREDOC. I'd like to make it 
   #   class_eval(&lt;&lt;-RUBY, __FILE__, __LINE__), but we should codify it somewhere.
-  def class_inheritable_writer(*syms)
-    options = syms.last.is_a?(Hash) ? syms.pop : {}
-    syms.each do |sym|
-      class_eval(&lt;&lt;-RUBY, __FILE__, __LINE__)
-        def self.#{sym}=(obj)
-          write_inheritable_attribute(:#{sym}, obj)
-        end
-      RUBY
-      unless options[:instance_writer] == false
-        class_eval &lt;&lt;-RUBY, __FILE__, __LINE__
-          def #{sym}=(obj)
-            self.class.#{sym} = obj
-          end
-        RUBY
-      end
-    end
-  end
-
-  # Defines class-level inheritable array writer. Arrays are available to subclasses,
-  # each subclass has a copy of parent's array. Difference between other inheritable
-  # attributes is that array is recreated every time it is written.
-  #
-  # @param *syms&lt;Array[*#to_s, Hash{:instance_writer =&gt; Boolean}]&gt; Array of array attribute 
-  #   names to define inheritable writer for.
-  # @option syms :instance_writer&lt;Boolean&gt; if true, instance-level inheritable array 
-  #   attribute writer is defined.
-  # @return &lt;Array[#to_s]&gt; An array of the attributes that were made into inheritable
-  #   array writers.
-  # 
-  # @api public
-  def class_inheritable_array_writer(*syms)
-    options = syms.last.is_a?(Hash) ? syms.pop : {}
-    syms.each do |sym|
-      class_eval(&lt;&lt;-RUBY, __FILE__, __LINE__)
-        def self.#{sym}=(obj)
-          write_inheritable_array(:#{sym}, obj)
+  def class_inheritable_writer(*ivars)
+    instance_writer = ivars.pop[:instance_writer] if ivars.last.is_a?(Hash)
+    ivars.each do |ivar|
+      self.class_eval &lt;&lt;-RUBY, __FILE__, __LINE__ + 1
+        def self.#{ivar}=(obj)
+          @#{ivar} = obj        
         end
       RUBY
-      unless options[:instance_writer] == false
-        class_eval(&lt;&lt;-RUBY, __FILE__, __LINE__)
-          def #{sym}=(obj)
-            self.class.#{sym} = obj
-          end
-        RUBY
-      end
-    end
-  end
-
-  # Defines class-level inheritable hash writer. Hashs are available to subclasses,
-  # each subclass has a copy of parent's hash. Difference between other inheritable
-  # attributes is that hash is recreated every time it is written.
-  #
-  # @param *syms&lt;Array[*#to_s, Hash{:instance_writer =&gt; Boolean}]&gt;:: Array of hash 
-  #   attribute names to define inheritable writer for.
-  # @option syms :instance_writer&lt;Boolean&gt;:: if true, instance-level inheritable hash
-  #   attribute writer is defined.
-  # @return &lt;Array[#to_s]&gt; An Array of attributes turned into hash_writers.
-  #
-  # @api public
-  def class_inheritable_hash_writer(*syms)
-    options = syms.last.is_a?(Hash) ? syms.pop : {}
-    syms.each do |sym|
-      class_eval(&lt;&lt;-RUBY, __FILE__, __LINE__)
-        def self.#{sym}=(obj)
-          write_inheritable_hash(:#{sym}, obj)
-        end
-      RUBY
-      unless options[:instance_writer] == false
-        class_eval(&lt;&lt;-RUBY, __FILE__, __LINE__)
-          def #{sym}=(obj)
-            self.class.#{sym} = obj
-          end
+      unless instance_writer == false
+        self.class_eval &lt;&lt;-RUBY, __FILE__, __LINE__ + 1
+          def #{ivar}=(obj) self.class.#{ivar} = obj end
         RUBY
       end
     end
   end
-
+  
   # Defines class-level inheritable attribute accessor. Attributes are available to subclasses,
   # each subclass has a copy of parent's attribute.
   #
@@ -228,136 +172,4 @@ class Class
     class_inheritable_reader(*syms)
     class_inheritable_writer(*syms)
   end
-
-  # Defines class-level inheritable array accessor. Arrays are available to subclasses,
-  # each subclass has a copy of parent's array. Difference between other inheritable
-  # attributes is that array is recreated every time it is written.
-  #
-  # @param *syms&lt;Array[*#to_s, Hash{:instance_writer =&gt; Boolean}]&gt; Array of array attribute 
-  #   names to define inheritable accessor for.
-  # @option syms :instance_writer&lt;Boolean&gt; if true, instance-level inheritable array
-  #   attribute writer is defined.
-  # @return &lt;Array[#to_s]&gt; An Array of attributes turned into inheritable arrays.
-  # 
-  # @api public
-  def class_inheritable_array(*syms)
-    class_inheritable_reader(*syms)
-    class_inheritable_array_writer(*syms)
-  end
-
-  # Defines class-level inheritable hash accessor. Hashs are available to subclasses,
-  # each subclass has a copy of parent's hash. Difference between other inheritable
-  # attributes is that hash is recreated every time it is written.
-  #
-  # @param *syms&lt;Array[*#to_s, Hash{:instance_writer =&gt; Boolean}]&gt; Array of hash attribute 
-  #   names to define inheritable accessor for.
-  # @option syms :instance_writer&lt;Boolean&gt; if true, instance-level inheritable hash 
-  #   attribute writer is defined.
-  # @return &lt;Array[#to_s]&gt; An Array of attributes turned into inheritable hashes.
-  def class_inheritable_hash(*syms)
-    class_inheritable_reader(*syms)
-    class_inheritable_hash_writer(*syms)
-  end
-
-  # @return &lt;Hash&gt; inheritable attributes hash or it's default value, new frozen Hash.
-  # 
-  # @api private
-  def inheritable_attributes
-    @inheritable_attributes ||= EMPTY_INHERITABLE_ATTRIBUTES
-  end
-
-  # Sets the attribute which copy is available to subclasses.
-  #
-  # @param key&lt;#to_s&gt; inheritable attribute name
-  # @param value&lt;not(Array, Hash)&gt; value of inheritable attribute
-  # @return &lt;not(Array, Hash)&gt; the value that was set
-  #
-  # @api private
-  #
-  # @note
-  #   If inheritable attributes storage has it's default value,
-  #   a new frozen hash, it is set to new Hash that is not frozen.
-  def write_inheritable_attribute(key, value)
-    if inheritable_attributes.equal?(EMPTY_INHERITABLE_ATTRIBUTES)
-      @inheritable_attributes = {}
-    end
-    inheritable_attributes[key] = value
-  end
-
-  # Sets the array attribute which copy is available to subclasses.
-  #
-  # @param key&lt;#to_s&gt; inheritable attribute name
-  # @param elements&lt;Array&gt; value of inheritable attribute
-  # @return &lt;Array&gt; the Array that was set
-  #
-  # @api private
-  #
-  # @note
-  #   Inheritable array is re-created on each write.
-  def write_inheritable_array(key, elements)
-    write_inheritable_attribute(key, []) if read_inheritable_attribute(key).nil?
-    write_inheritable_attribute(key, read_inheritable_attribute(key) + elements)
-  end
-
-  # Sets the hash attribute which copy is available to subclasses.
-  #
-  # @param key&lt;#to_s&gt; inheritable attribute name
-  # @param value&lt;Hash&gt; value of inheritable attribute
-  # @return &lt;Hash&gt; the new hash that resulted from merging the new values
-  #   with the inherited values.
-  #
-  # @api private
-  #
-  # @note
-  #   Inheritable hash is re-created on each write.
-  def write_inheritable_hash(key, hash)
-    write_inheritable_attribute(key, {}) if read_inheritable_attribute(key).nil?
-    write_inheritable_attribute(key, read_inheritable_attribute(key).merge(hash))
-  end
-
-  # Reads value of inheritable attributes.
-  #
-  # @param key&lt;#to_s&gt; the key of the attribute to read
-  # @return &lt;Object&gt; 
-  #   Inheritable attribute value. Subclasses store copies of values.
-  #
-  # @api private
-  def read_inheritable_attribute(key)
-    inheritable_attributes[key]
-  end
-
-  # Resets inheritable attributes.
-  #
-  # @return &lt;Object&gt; the empty inheritable attributes. By default, this
-  #   is a frozen, empty Hash. You can override this for a class by defining
-  #   EMPTY_INHERITABLE_ATTRIBUTES
-  #
-  # @api private
-  #
-  # @todo do we need this?
-  def reset_inheritable_attributes
-    @inheritable_attributes = EMPTY_INHERITABLE_ATTRIBUTES
-  end
-
-  private
-    # Prevent this constant from being created multiple times
-    EMPTY_INHERITABLE_ATTRIBUTES = {}.freeze unless const_defined?(:EMPTY_INHERITABLE_ATTRIBUTES)
-
-    # @todo document this
-    def inherited_with_inheritable_attributes(child)
-      inherited_without_inheritable_attributes(child) if respond_to?(:inherited_without_inheritable_attributes)
-
-      if inheritable_attributes.equal?(EMPTY_INHERITABLE_ATTRIBUTES)
-        new_inheritable_attributes = EMPTY_INHERITABLE_ATTRIBUTES
-      else
-        new_inheritable_attributes = inheritable_attributes.inject({}) do |memo, (key, value)|
-          memo.update(key =&gt; ((value.is_a?(Module) ? value : value.dup) rescue value))
-        end
-      end
-
-      child.instance_variable_set('@inheritable_attributes', new_inheritable_attributes)
-    end
-
-    alias inherited_without_inheritable_attributes inherited
-    alias inherited inherited_with_inheritable_attributes
 end</diff>
      <filename>lib/merb-core/core_ext/class.rb</filename>
    </modified>
  </modified>
  <removed type="array">
    <removed>
      <filename>spec/private/core_ext/class_spec.rb</filename>
    </removed>
  </removed>
  <parents type="array">
    <parent>
      <id>8a2e4d1daf96a3beaed151d643d497e8a52cae1f</id>
    </parent>
  </parents>
  <author>
    <name>Yehuda Katz</name>
    <email>wycats@gmail.com</email>
  </author>
  <url>http://github.com/wycats/merb-core/commit/b5e42a1d7e1000516b7799bbc35efe442bbea6c9</url>
  <id>b5e42a1d7e1000516b7799bbc35efe442bbea6c9</id>
  <committed-date>2008-06-27T21:36:13-07:00</committed-date>
  <authored-date>2008-06-27T21:36:13-07:00</authored-date>
  <message>Redo Merb's inheritable_accessors so that they have correct semantics, then redo everything that uses inheritable_accessors so they don't have to hack around the bad semantics.</message>
  <tree>b23327b14d1f1e72fc1b368ecae8f2670f8aa6c1</tree>
  <committer>
    <name>Yehuda Katz</name>
    <email>wycats@gmail.com</email>
  </committer>
</commit>
