<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>MIT-LICENSE</filename>
    </added>
    <added>
      <filename>lib/active_record/acts/category_content.rb</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -187,7 +187,7 @@ In your layout, make sure that you have all the JavaScripts included, that will
 
 Then, in your view, you can call this little helper to generate a drag and drop list where you can re-sort the positions. Remember to provide the name of the model to use:
 
-  &lt;%= sortable_categories Category %&gt;
+  &lt;%= aac_sortable_tree Category %&gt;
 
 Finally, in your controller create an action method like this:
 
@@ -198,7 +198,7 @@ Finally, in your controller create an action method like this:
   
 And you can already try it. You can change the URL to that action method like this:
 
-  &lt;%= sortable_categories(Category, {:action =&gt; :update_positions}) %&gt;
-  &lt;%= sortable_categories(Category, {:controller =&gt; :mycontroller, :action =&gt; :update_positions}) %&gt;
+  &lt;%= aac_sortable_tree(Category, {:action =&gt; :update_positions}) %&gt;
+  &lt;%= aac_sortable_tree(Category, {:controller =&gt; :mycontroller, :action =&gt; :update_positions}) %&gt;
 
 === Have fun.
\ No newline at end of file</diff>
      <filename>README</filename>
    </modified>
    <modified>
      <diff>@@ -5,19 +5,18 @@ require 'rake/rdoctask'
 desc 'Default: run unit tests.'
 task :default =&gt; :test
 
-desc 'Test acts_as_category plugin.'
+desc 'Test the acts_as_category plugin.'
 Rake::TestTask.new(:test) do |t|
   t.libs &lt;&lt; 'lib'
   t.pattern = 'test/**/*_test.rb'
   t.verbose = true
 end
 
-desc 'Generate documentation for acts_as_category plugin.'
+desc 'Generate documentation for the acts_as_category plugin.'
 Rake::RDocTask.new(:rdoc) do |rdoc|
   rdoc.rdoc_dir = 'rdoc'
-  rdoc.title    = 'acts_as_category'
+  rdoc.title    = 'ActsAsCategory'
   rdoc.options &lt;&lt; '--line-numbers' &lt;&lt; '--inline-source'
   rdoc.rdoc_files.include('README')
-  rdoc.rdoc_files.include('lib/active_record/acts/category.rb')
-  #rdoc.rdoc_files.include('lib/**/**/.rb')
+  rdoc.rdoc_files.include('lib/**/*.rb')
 end</diff>
      <filename>Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -1,2 +1,3 @@
 ActiveRecord::Base.send :include, ActiveRecord::Acts::Category
+ActiveRecord::Base.send :include, ActiveRecord::Acts::CategoryContent
 ActionView::Base.send :include, ActsAsCategoryHelper</diff>
      <filename>init.rb</filename>
    </modified>
    <modified>
      <diff>@@ -10,36 +10,38 @@ module ActiveRecord
       def self.included(base)
         # Add class methods module of Acts::Category to the superior class ActiveRecord
         # In that module, the InstanceMethods will be added as well
-        base.extend(ClassMethods)
+        base.extend ClassMethods
       end
 
       #######################
       # ClassMethods module #
       #######################
       
-      module ClassMethods
+      module ClassMethods        
         # Please refer to README for more information about this plugin.
         #
-        # create_table :category do |t|
-        #   t.column :parent_id,         :integer
-        #   t.column :position,          :integer
-        #   t.column :hidden,            :boolean
-        #   t.column :children_count,    :integer
-        #   t.column :ancestors_count,   :integer
-        #   t.column :descendants_count, :integer
-        # end
+        #  create_table &quot;categories&quot;, :force =&gt; true do |t|
+        #    t.integer &quot;parent_id&quot;
+        #    t.integer &quot;position&quot;
+        #    t.boolean &quot;hidden&quot;
+        #    t.integer &quot;children_count&quot;
+        #    t.integer &quot;ancestors_count&quot;
+        #    t.integer &quot;descendants_count&quot;
+        #  end
         #
         # Configuration options are:
         #
         # * &lt;tt&gt;foreign_key&lt;/tt&gt; - specifies the column name to use for tracking of the tree (default: +parent_id+)
         # * &lt;tt&gt;position&lt;/tt&gt; - specifies the integer column name to use for ordering siblings (default: +position+)
+        # * &lt;tt&gt;hidden&lt;/tt&gt; - specifies a column name to use for hidden flag (default: +hidden+)
         # * &lt;tt&gt;children_count&lt;/tt&gt; - specifies a column name to use for caching number of children (default: +children_count+)
         # * &lt;tt&gt;ancestors_count&lt;/tt&gt; - specifies a column name to use for caching number of ancestors (default: +ancestors_count+)
         # * &lt;tt&gt;descendants_count&lt;/tt&gt; - specifies a column name to use for caching number of descendants (default: +descendants_count+)
+        # * &lt;tt&gt;memoize&lt;/tt&gt; - Should memoization be used in order to speed up performance? (default: +true+)
         def acts_as_category(options = {})
-    
+        
           # Load parameters whenever acts_as_category is called
-          configuration = { :foreign_key =&gt; &quot;parent_id&quot;, :position =&gt; &quot;position&quot;, :hidden =&gt; &quot;hidden&quot;, :children_count =&gt; 'children_count', :ancestors_count =&gt; 'ancestors_count', :descendants_count =&gt; 'descendants_count' }
+          configuration = { :foreign_key =&gt; &quot;parent_id&quot;, :position =&gt; &quot;position&quot;, :hidden =&gt; &quot;hidden&quot;, :children_count =&gt; 'children_count', :ancestors_count =&gt; 'ancestors_count', :descendants_count =&gt; 'descendants_count', :memoize =&gt; true }
           configuration.update(options) if options.is_a?(Hash)
           
           # Create a class association to itself
@@ -83,6 +85,7 @@ module ActiveRecord
             permissions = []
             ids.each { |id| permissions &lt;&lt; id.to_i if id.to_i &gt; 0 } if ids.is_a?(Array)
             class_variable_set :@@permissions, permissions.uniq
+            # TODO?: unmemoize_all if memoize?
           end
           
           # This class_eval contains methods which cannot be added wihtout having a concrete model.
@@ -92,17 +95,20 @@ module ActiveRecord
           # and not already when our plugin's init.rb adds our Acts::Category modules to ActiveRecord.
           # Another example is, that we want to overwrite the association method &quot;children&quot;, but this
           # association doesn't exist before acts_as_category is actually called. So we need class_eval.
-
+ 
           class_eval &lt;&lt;-EOV
           
             ##############################
             # Generated instance methods #
             ##############################
           
+            # Make class methods memoizable
+            class &lt;&lt; self; extend ActiveSupport::Memoizable if #{configuration[:memoize]}; end
+          
             # Include instance methods from our InstanceMethods module
             include ActiveRecord::Acts::Category::InstanceMethods
             
-            # Define instance getter and setter methods to keep track of the column name options
+            # Define instance getter and setter methods to keep track of the option parameters
             def parent_id_column() '#{configuration[:foreign_key]}' end
             def parent_id_column=(id) write_attribute('#{configuration[:foreign_key]}', id) end
             def position_column() '#{configuration[:position]}' end
@@ -111,6 +117,8 @@ module ActiveRecord
             def children_count_column() '#{configuration[:children_count]}' end
             def ancestors_count_column() '#{configuration[:ancestors_count]}' end
             def descendants_count_column() '#{configuration[:descendants_count]}' end
+            def self.memoize?() #{configuration[:memoize]} end
+            def memoize?() #{configuration[:memoize]} end
 
             # Overwrite the children association method, so that it will respect permitted/hidden categories
             # Note: If you ask about the children of a not-permitted category, the result will be an empty array in any case
@@ -124,13 +132,14 @@ module ActiveRecord
             ###########################
             # Generated class methods #
             ###########################
-        
+                
             # Update cache columns of a whole branch, which includes the given +category+ or its +id+.
             def self.refresh_cache_of_branch_with(category)
               category = find(category) unless category.instance_of?(self)   # possibly convert id into category
               root = category.#{configuration[:foreign_key]}.nil? ? category : category.root   # find root of category (if not already)
               root.refresh_cache
               root.descendants.each { |d| d.refresh_cache }
+              # TODO?: unmemoize_all if #{configuration[:memoize]}
             end
 
             # Creates a WHERE clause for SQL statements, which causes forbidden categories not to be included. Adds AND statement if parameter +true+ is given.
@@ -145,20 +154,21 @@ module ActiveRecord
             
             # Returns the +category+ to a given +id+. This is as a replacement for find(id), but it respects permitted/hidden categories.
             def self.get(id)
-              find(:first, :conditions =&gt; 'id = ' + id.to_i.to_s + where_permitted(true), :order =&gt; #{configuration[:position].nil? ? 'nil' : %Q{&quot;#{configuration[:position]}&quot;}})
+              find(:first, :conditions =&gt; 'id = ' + id.to_i.to_s + where_permitted(true))
             end
             
             # Returns all root +categories+, respecting permitted/hidden ones
+            # (Note: I tried to memoize this function, but it would not work correctly, so I let it be)
             def self.roots(ignore_permissions = false)
               where_clause = ignore_permissions ? '' : where_permitted(true)
               find(:all, :conditions =&gt; '#{configuration[:foreign_key]} IS NULL' + where_clause, :order =&gt; #{configuration[:position].nil? ? 'nil' : %Q{&quot;#{configuration[:position]}&quot;}})
             end
-         
+            
             # Receives the controller's +params+ variable and updates category positions accordingly.
             # Please refer to the helper methods that came with this model for further information.
             def self.update_positions(params)
               params.each_key { |key|
-                if key.include?('sortable_categories_')
+                if key.include?('aac_sortable_tree_')
                   parent_id = key.split('_').last.to_i
                   params[key].each_with_index { |id, position|
                     category = find(id)
@@ -187,6 +197,9 @@ module ActiveRecord
       
       module InstanceMethods
         
+        def self.memoize?() end # Dummy which is overwritten by class_eval
+        extend ActiveSupport::Memoizable if memoize?
+        
         ####################
         # Instance methods #
         ####################
@@ -201,6 +214,7 @@ module ActiveRecord
           end
           true
         end
+        memoize :permitted? if memoize?
 
         # Returns +array+ of children's ids, respecting permitted/hidden categories
        	def children_ids
@@ -208,14 +222,16 @@ module ActiveRecord
           self.children.each { |child| children_ids &lt;&lt; child.id if child.permitted? } unless self.children.empty?
           children_ids
         end
-        
+        memoize :children_ids if memoize?
+
         # Returns list of ancestors, disregarding any permissions
         def ancestors
           node, nodes = self, []
           nodes &lt;&lt; node = node.parent while node.parent
           nodes
         end
-        
+        memoize :ancestors if memoize?
+
         # Returns array of IDs of ancestors, disregarding any permissions
        	def ancestors_ids
           node, nodes = self, []
@@ -225,6 +241,7 @@ module ActiveRecord
           end
           nodes
         end
+        memoize :ancestors_ids if memoize?
 
         # Returns list of descendants, respecting permitted/hidden categories
        	def descendants
@@ -235,7 +252,8 @@ module ActiveRecord
        	  } unless self.children.empty?
        	  descendants 
        	end
-       	
+        memoize :descendants if memoize?
+
        	# Returns array of IDs of descendants, respecting permitted/hidden categories
        	def descendants_ids(ignore_permissions = false)
        	  descendants_ids = [] 
@@ -245,13 +263,15 @@ module ActiveRecord
        	  } unless self.children.empty?
        	  descendants_ids
        	end
-       	
+        memoize :descendants_ids if memoize?
+
         # Returns the root node of the branch, disregarding any permissions
         def root
           node = self
           node = node.parent while node.parent
           node
         end
+        memoize :root if memoize?
         
         # Returns +true+ if category is root, otherwise +false+, disregarding any permissions
         def root?
@@ -269,7 +289,7 @@ module ActiveRecord
         def self_and_siblings
           parent ? parent.children : self.class.roots
         end
-        
+
         # Immediately refresh cache of category instance
         def refresh_cache
           self.class.connection.execute &quot;UPDATE #{self.class.table_name} SET #{ancestors_count_column}=#{self.ancestors.size},  #{descendants_count_column}=#{self.descendants.size} WHERE id=#{self.id}&quot;</diff>
      <filename>lib/active_record/acts/category.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,24 +1,66 @@
 module ActsAsCategoryHelper
   
-  def sortable_categories(model, ajaxurl = {:controller =&gt; :funkengallery, :action =&gt; :update_positions}, column = 'name')
+  extend ActiveSupport::Memoizable
+  
+  def aac_tree(roots)
+    result = '&lt;ul class=&quot;tree_root&quot;&gt;'
+    roots.each { |root| result += aac_tree_category(root) }
+    result += '&lt;/ul&gt;'
+  end
+  memoize :aac_tree
+  
+  def aac_sortable_tree(model, ajaxurl = {:controller =&gt; :funkengallery, :action =&gt; :update_positions}, column = 'name')
     raise &quot;Model '#{model.to_s}' does not acts_as_category&quot; unless model.respond_to?(:acts_as_category)
-    result = '&lt;div id=&quot;sortable_category_response&quot; &quot;&gt;&lt;/div&gt;'
-    model.roots.each { |root| result += sortable_category_list(root, ajaxurl, column) }
+    result = '&lt;div id=&quot;aac_sortable_tree_response&quot; &quot;&gt;&lt;/div&gt;'
+    model.roots.each { |root| result += aac_sortable_tree_list(root, ajaxurl, column) }
     result
   end
+  
+  private 
+  
+  def aac_tree_category(category)
+    anchor = &quot;aac_tree_#{category.id.to_s}&quot;
+    if category.ancestors_count == 0
+      # CSS for root categories
+      html_headline = ' class=&quot;tree_headline&quot; ' 
+      html_count = ''
+    else
+      # CSS for any deeper level of categories
+      html_headline = '' 
+      html_count = ' &lt;span class=&quot;tree_count&quot;&gt; ' + h(category.pictures_count.to_s)+ '&lt;/span&gt;'
+    end
+
+    result = tag('a', {:name =&gt; anchor})
+    result += &quot;&lt;li#{html_headline}&gt;&quot;
+    result += '&lt;b&gt;' if @category == category.id
+    if category.pictures_count == 0 or category.ancestors_count == 0 or category.children_count &gt; 0 then
+      result += content_tag('a', h(category.name), :onclick =&gt; &quot;new Element.toggle('#{anchor}')&quot;, :href =&gt; &quot;\##{anchor}&quot;)
+    else
+      result += link_to_unless_current h(category.name), {:controller =&gt; 'category', :id =&gt; category.id } unless category.ancestors_count == 0
+    end
+    result += '&lt;/b&gt;' if @category == category.id
+    result += html_count if category.pictures_count &gt; 0
+    result += '&lt;/li&gt;'
 
-  private
+    if category.children_count &gt; 0
+      addon = (category.ancestors_count == 0 or category.descendants_ids.include?(@category) or (category.self_and_siblings_ids.include?(@category) and category.children_count == 0)) ? '' : ' style=&quot;display: none;&quot;'
+      result += &quot;&lt;ul id='#{anchor}' #{addon}&gt;&quot;
+      category.children.each { |child| result += aac_tree_category(child) }
+      result += '&lt;/ul&gt;'
+    end
+    result
+  end
   
-  def sortable_category_list(category, ajaxurl, column = 'name')
+  def aac_sortable_tree_list(category, ajaxurl, column = 'name')
     parent_id = category.parent ? category.parent.id.to_s : '0'
     firstitem = category.read_attribute(category.position_column) == 1
     lastitem  = category.position == category.self_and_siblings.size
     result = ''
-    result += &quot;&lt;ul id=\&quot;sortable_categories_#{parent_id}\&quot;&gt;\n&quot; if firstitem
+    result += &quot;&lt;ul id=\&quot;aac_sortable_tree_#{parent_id}\&quot;&gt;\n&quot; if firstitem
     result += &quot;&lt;li id=\&quot;category_#{category.id}\&quot;&gt;#{category.read_attribute(column)}&quot;
     result += category.children.empty? ? &quot;&lt;/li&gt;\n&quot; : &quot;\n&quot;
-    category.children.each {|child| result += sortable_category_list(child, ajaxurl, column = 'name') } unless category.children.empty?
-    result += &quot;&lt;/ul&gt;&lt;/li&gt;\n&quot; + sortable_element(&quot;sortable_categories_#{parent_id}&quot;, :update =&gt; 'sortable_category_response', :url =&gt; ajaxurl) if lastitem
+    category.children.each {|child| result += aac_sortable_tree_list(child, ajaxurl, column = 'name') } unless category.children.empty?
+    result += &quot;&lt;/ul&gt;&lt;/li&gt;\n&quot; + sortable_element(&quot;aac_sortable_tree_#{parent_id}&quot;, :update =&gt; 'aac_sortable_tree_response', :url =&gt; ajaxurl) if lastitem
     result
   end
 </diff>
      <filename>lib/acts_as_category_helper.rb</filename>
    </modified>
    <modified>
      <diff>@@ -9,8 +9,10 @@
 # For further information see http://blog.funkensturm.de/ruby-on-rails-plugins
 
 require 'test/unit'
+
 require 'rubygems'
 require 'active_record'
+require 'action_view'
 
 ActiveRecord::Base.establish_connection(:adapter =&gt; &quot;sqlite3&quot;, :dbfile =&gt; &quot;:memory:&quot;)
 $stdout = StringIO.new # Prevent ActiveRecord's annoying schema statements
@@ -18,13 +20,13 @@ $stdout = StringIO.new # Prevent ActiveRecord's annoying schema statements
 def setup_db
   ActiveRecord::Base.logger
   ActiveRecord::Schema.define(:version =&gt; 1) do
-    create_table :categories do |t|
-      t.column :parent_id,         :integer
-      t.column :position,          :integer
-      t.column :hidden,            :boolean
-      t.column :children_count,    :integer
-      t.column :ancestors_count,   :integer
-      t.column :descendants_count, :integer
+    create_table &quot;categories&quot;, :force =&gt; true do |t|
+      t.integer &quot;my_parent_id&quot;
+      t.integer &quot;my_position&quot;
+      t.boolean &quot;my_hidden&quot;
+      t.integer &quot;my_children_count&quot;
+      t.integer &quot;my_ancestors_count&quot;
+      t.integer &quot;my_descendants_count&quot;
     end
   end
 end
@@ -39,13 +41,18 @@ setup_db # Because the plugin needs an existing table before initialization (e.g
 
 $:.unshift File.dirname(__FILE__) + '/../lib' # make &quot;lib&quot; known to &quot;require&quot;
 require 'active_record/acts/category'
+require 'active_record/acts/category_content'
+require 'acts_as_category_helper'
 require File.dirname(__FILE__) + '/../init' # Initialize Plugin
 
-#class Mixin &lt; ActiveRecord::Base 
-#end
-
 class Category &lt; ActiveRecord::Base
-  acts_as_category
+  acts_as_category :foreign_key =&gt; 'my_parent_id',
+                   :position =&gt; 'my_position',
+                   :hidden =&gt; 'my_hidden',
+                   :children_count =&gt; 'my_children_count',
+                   :ancestors_count =&gt; 'my_ancestors_count',
+                   :descendants_count =&gt; 'my_descendants_count',
+                   :memoize =&gt; true
 end
 
 teardown_db # Because CategoryTest's setup method won't execute setup_db otherwise
@@ -64,12 +71,12 @@ class CategoryTest &lt; Test::Unit::TestCase
     assert @r1   = Category.create! # id 1
     assert @r2   = Category.create! # id 2
     assert @r3   = Category.create! # id 3
-    assert @r11  = Category.create!(:parent_id =&gt; @r1.id) # id 4
-    assert @r21  = Category.create!(:parent_id =&gt; @r2.id) # id 5
-    assert @r22  = Category.create!(:parent_id =&gt; @r2.id) # id 6
-    assert @r111 = Category.create!(:parent_id =&gt; @r11.id) # id 7
-    assert @r211 = Category.create!(:parent_id =&gt; @r21.id) # id 8
-    assert @r221 = Category.create!(:parent_id =&gt; @r22.id) # id 9
+    assert @r11  = Category.create!(:my_parent_id =&gt; @r1.id) # id 4
+    assert @r21  = Category.create!(:my_parent_id =&gt; @r2.id) # id 5
+    assert @r22  = Category.create!(:my_parent_id =&gt; @r2.id) # id 6
+    assert @r111 = Category.create!(:my_parent_id =&gt; @r11.id) # id 7
+    assert @r211 = Category.create!(:my_parent_id =&gt; @r21.id) # id 8
+    assert @r221 = Category.create!(:my_parent_id =&gt; @r22.id) # id 9
     assert @r1   = Category.find(1)
     assert @r2   = Category.find(2)
     assert @r3   = Category.find(3)
@@ -89,11 +96,16 @@ class CategoryTest &lt; Test::Unit::TestCase
   def check_cache # This is merely a method used by certain tests
     Category.find(:all).each { |c|
       # Note that &quot;children_count&quot; is a built-in Rails functionality and must not be tested here
-      assert_equal c.ancestors.size,   c.ancestors_count
-      assert_equal c.descendants.size, c.descendants_count
+      assert_equal c.ancestors.size,   c.my_ancestors_count
+      assert_equal c.descendants.size, c.my_descendants_count
     }
   end
   
+  def test_memoizabla_plugin_options_parameters
+    assert Category.memoize?
+    assert @r1.memoize?
+  end
+  
   def test_cache_columns
     check_cache
   end
@@ -116,47 +128,47 @@ class CategoryTest &lt; Test::Unit::TestCase
     Category.permissions.clear
     assert_equal [], Category.permissions
   end
-  
+
   def test_where_permitted_sql_query
-    assert_equal ' (hidden IS NULL) ', Category.where_permitted
-    assert_equal ' AND (hidden IS NULL) ', Category.where_permitted(true)
+    assert_equal ' (my_hidden IS NULL) ', Category.where_permitted
+    assert_equal ' AND (my_hidden IS NULL) ', Category.where_permitted(true)
     Category.permissions = [1,2,3]
-    assert_equal ' (hidden IS NULL OR id IN (1,2,3)) ', Category.where_permitted
-    assert_equal ' AND (hidden IS NULL OR id IN (1,2,3)) ', Category.where_permitted(true)
+    assert_equal ' (my_hidden IS NULL OR id IN (1,2,3)) ', Category.where_permitted
+    assert_equal ' AND (my_hidden IS NULL OR id IN (1,2,3)) ', Category.where_permitted(true)
   end
   
   def test_attr_readonly
-    assert @r1.children_count = 99
-    assert @r1.ancestors_count = 99
-    assert @r1.descendants_count = 99
+    assert @r1.my_children_count = 99
+    assert @r1.my_ancestors_count = 99
+    assert @r1.my_descendants_count = 99
     assert @r1.save
     assert @r1 = Category.find(1)
-    assert_nil @r1.children_count
-    assert_equal 0, @r1.ancestors_count
-    assert_equal 2, @r1.descendants_count
-    assert @r1.update_attribute('children_count', 99)
-    assert @r1.update_attribute('ancestors_count', 99)
-    assert @r1.update_attribute('descendants_count', 99)
+    assert_equal 1, @r1.my_children_count
+    assert_equal 0, @r1.my_ancestors_count
+    assert_equal 2, @r1.my_descendants_count
+    assert @r1.update_attribute('my_children_count', 99)
+    assert @r1.update_attribute('my_ancestors_count', 99)
+    assert @r1.update_attribute('my_descendants_count', 99)
     assert @r1 = Category.find(1)
-    assert_nil @r1.children_count
-    assert_equal 0, @r1.ancestors_count
-    assert_equal 2, @r1.descendants_count
+    assert_equal 1, @r1.my_children_count
+    assert_equal 0, @r1.my_ancestors_count
+    assert_equal 2, @r1.my_descendants_count
   end
 
   def test_permitted?
     assert @r3.permitted?
-    assert @r3.update_attribute('hidden', true)
+    assert @r3.update_attribute('my_hidden', true)
     assert !@r3.permitted?
     Category.permissions = [@r3.id]
     assert @r3.permitted?
     Category.permissions.clear
     assert !@r3.permitted?
-    assert @r3.update_attribute('hidden', false)
+    assert @r3.update_attribute('my_hidden', false)
     assert @r3.permitted?
     assert @r2.permitted?
     assert @r21.permitted?
     assert @r211.permitted?
-    assert @r211.update_attribute('hidden', true)
+    assert @r211.update_attribute('my_hidden', true)
     assert @r2.permitted?
     assert @r21.permitted?
     assert !@r211.permitted?
@@ -169,22 +181,22 @@ class CategoryTest &lt; Test::Unit::TestCase
     assert @r2.permitted?
     assert @r21.permitted?
     assert !@r211.permitted?
-    assert @r211.update_attribute('hidden', false)
+    assert @r211.update_attribute('my_hidden', false)
     assert @r2.permitted?
     assert @r21.permitted?
     assert @r211.permitted?
-    assert @r21.update_attribute('hidden', true)
+    assert @r21.update_attribute('my_hidden', true)
     assert @r2.permitted?
     assert !@r21.permitted?
-    assert !@r211.hidden
+    assert !@r211.my_hidden
     assert !@r211.permitted?
     Category.permissions = [@r21.id]
     assert @r2.permitted?
     assert @r21.permitted?
     assert @r211.permitted?
     Category.permissions.clear
-    assert @r2.update_attribute('hidden', true)
-    assert @r21.update_attribute('hidden', false)
+    assert @r2.update_attribute('my_hidden', true)
+    assert @r21.update_attribute('my_hidden', false)
     assert !@r2.permitted?
     assert !@r21.permitted?
     assert !@r211.permitted?
@@ -211,7 +223,7 @@ class CategoryTest &lt; Test::Unit::TestCase
   end
 
   def test_children_permissions
-    assert @r22.update_attribute('hidden', true)
+    assert @r22.update_attribute('my_hidden', true)
     assert_equal [@r21, @r22], @r2.orig_children
     assert_equal [@r11], @r1.children
     assert_equal [@r21], @r2.children
@@ -237,7 +249,7 @@ class CategoryTest &lt; Test::Unit::TestCase
   end
 
   def test_children_ids_permissions
-    assert @r22.update_attribute('hidden', true)
+    assert @r22.update_attribute('my_hidden', true)
     assert_equal [4], @r1.children_ids
     assert_equal [5], @r2.children_ids
     assert_equal [], @r3.children_ids
@@ -259,8 +271,8 @@ class CategoryTest &lt; Test::Unit::TestCase
      assert_equal 1, @r22.children.size
      assert_equal 0, @r211.children.size
      assert_equal 0, @r221.children.size
-     assert @r111.update_attribute('hidden', true)
-     assert @r22.update_attribute('hidden', true)
+     assert @r111.update_attribute('my_hidden', true)
+     assert @r22.update_attribute('my_hidden', true)
      assert_equal 1, @r1.children.size
      assert_equal 1, @r2.children.size
      assert_equal 0, @r3.children.size
@@ -321,7 +333,7 @@ class CategoryTest &lt; Test::Unit::TestCase
   end
   
   def test_descendants_permissions
-    assert @r22.update_attribute('hidden', true)
+    assert @r22.update_attribute('my_hidden', true)
     assert_equal [@r11, @r111], @r1.descendants
     assert_equal [@r21, @r211], @r2.descendants
     assert_equal [], @r3.descendants
@@ -349,7 +361,7 @@ class CategoryTest &lt; Test::Unit::TestCase
   end
 
   def test_descendants_ids_permissions
-    assert @r22.update_attribute('hidden', true)
+    assert @r22.update_attribute('my_hidden', true)
     assert_equal [4, 7], @r1.descendants_ids
     assert_equal [5, 8], @r2.descendants_ids
     assert_equal [], @r3.descendants_ids
@@ -373,7 +385,7 @@ class CategoryTest &lt; Test::Unit::TestCase
   end
 
   def test_root_permissions # i. e. ignoring permissions
-    assert @r22.update_attribute('hidden', true)
+    assert @r22.update_attribute('my_hidden', true)
     assert_equal @r2, @r2.root
     assert_equal @r2, @r22.root
     assert_equal @r2, @r221.root
@@ -386,7 +398,7 @@ class CategoryTest &lt; Test::Unit::TestCase
   end
   
   def test_root_permissions # i. e. ignoring permissions
-    assert @r3.update_attribute('hidden', true)
+    assert @r3.update_attribute('my_hidden', true)
     assert @r1.root?
     assert @r3.root?
     assert !@r11.root?
@@ -398,12 +410,12 @@ class CategoryTest &lt; Test::Unit::TestCase
   end
 
   def test_roots_permissions
-    assert @r2.update_attribute('hidden', true)
+    assert @r2.update_attribute('my_hidden', true)
     assert_equal [@r1, @r3], Category.roots
   end
   
   def test_roots_permissions_override
-    assert @r2.update_attribute('hidden', true)
+    assert @r2.update_attribute('my_hidden', true)
     assert_equal [@r1, @r2, @r3], Category.roots(true)
   end
   
@@ -420,7 +432,7 @@ class CategoryTest &lt; Test::Unit::TestCase
   end
   
   def test_siblings_permissions
-    assert @r2.update_attribute('hidden', true)
+    assert @r2.update_attribute('my_hidden', true)
     assert_equal [@r3], @r1.siblings
     assert_equal [@r1, @r3], @r2.siblings
     assert_equal [@r1], @r3.siblings
@@ -430,13 +442,13 @@ class CategoryTest &lt; Test::Unit::TestCase
     assert_equal [], @r111.siblings
     assert_equal [], @r211.siblings
     assert_equal [], @r221.siblings
-    assert @r22.update_attribute('hidden', true)
+    assert @r22.update_attribute('my_hidden', true)
     assert_equal [], @r21.siblings
     assert_equal [], @r22.siblings
     assert_equal [], @r111.siblings
     assert_equal [], @r211.siblings
     assert_equal [], @r221.siblings
-    assert @r2.update_attribute('hidden', false)
+    assert @r2.update_attribute('my_hidden', false)
     assert_equal [], @r22.siblings
   end
   
@@ -453,7 +465,7 @@ class CategoryTest &lt; Test::Unit::TestCase
   end
 
   def test_self_and_siblings_permissions
-    assert @r22.update_attribute('hidden', true)
+    assert @r22.update_attribute('my_hidden', true)
     assert_equal [@r1, @r2, @r3], @r1.self_and_siblings
     assert_equal [@r1, @r2, @r3], @r2.self_and_siblings
     assert_equal [@r1, @r2, @r3], @r3.self_and_siblings
@@ -495,19 +507,19 @@ class CategoryTest &lt; Test::Unit::TestCase
     Category.new().save
     assert @r3 = Category.find(3)
     check_cache
-    assert @r11  = Category.create!(:parent_id =&gt; @r1.id)
+    assert @r11  = Category.create!(:my_parent_id =&gt; @r1.id)
     check_cache
-    Category.new(:parent_id =&gt; @r2.id).save
+    Category.new(:my_parent_id =&gt; @r2.id).save
     assert @r21 = Category.find(5)
     check_cache
-    assert @r22  = Category.create!(:parent_id =&gt; @r2.id)
+    assert @r22  = Category.create!(:my_parent_id =&gt; @r2.id)
     check_cache
-    Category.new(:parent_id =&gt; @r11.id).save
+    Category.new(:my_parent_id =&gt; @r11.id).save
     assert @r111 = Category.find(7)
     check_cache
-    assert @r211 = Category.create!(:parent_id =&gt; @r21.id)
+    assert @r211 = Category.create!(:my_parent_id =&gt; @r21.id)
     check_cache
-    assert @r221 = Category.create!(:parent_id =&gt; @r22.id)
+    assert @r221 = Category.create!(:my_parent_id =&gt; @r22.id)
     check_cache
     @r12 = @r1.children.create
     check_cache
@@ -521,69 +533,69 @@ class CategoryTest &lt; Test::Unit::TestCase
   end
 
   def test_update_where_root_becomes_child
-    @r1.update_attributes(:parent_id =&gt; @r21.id)
+    @r1.update_attributes(:my_parent_id =&gt; @r21.id)
     check_cache
   end
 
   def test_update_where_child_becomes_root
-    @r111.update_attributes(:parent_id =&gt;nil)
+    @r111.update_attributes(:my_parent_id =&gt;nil)
     check_cache
   end
 
   def test_update_where_child_switches_within_branch
-    @r22.update_attributes(:parent_id =&gt; @r211.id)
+    @r22.update_attributes(:my_parent_id =&gt; @r211.id)
     check_cache
   end
 
   def test_update_where_child_switches_branch
-    @r221.update_attributes(:parent_id =&gt; @r11.id)
+    @r221.update_attributes(:my_parent_id =&gt; @r11.id)
     check_cache
   end
 
   def test_invalid_parent_id_type
-    assert !Category.new(:parent_id =&gt; 0.0).save
-    assert !Category.new(:parent_id =&gt; 1.5).save
-    assert !Category.new(:parent_id =&gt; 0).save
-    assert !Category.new(:parent_id =&gt; 'string').save
+    assert !Category.new(:my_parent_id =&gt; 0.0).save
+    assert !Category.new(:my_parent_id =&gt; 1.5).save
+    assert !Category.new(:my_parent_id =&gt; 0).save
+    assert !Category.new(:my_parent_id =&gt; 'string').save
   end
 
   def test_non_existant_foreign_key
-    assert !Category.new(:parent_id =&gt; 9876543210).save
-    assert_raise(ActiveRecord::RecordInvalid) { Category.create!(:parent_id =&gt; 9876543210) }
+    assert !Category.new(:my_parent_id =&gt; 9876543210).save
+    assert_raise(ActiveRecord::RecordInvalid) { Category.create!(:my_parent_id =&gt; 9876543210) }
   end
 
   def test_category_becomes_its_own_parent
-    assert !@r1.update_attributes(:parent_id =&gt; @r1.id)
-    assert @r2.parent_id = @r2.id
+    assert !@r1.update_attributes(:my_parent_id =&gt; @r1.id)
+    assert @r2.my_parent_id = @r2.id
     assert !@r2.save
   end
 
   def test_category_becomes_parent_of_descendant
-    assert !@r1.update_attributes(:parent_id =&gt; @r11.id)
-    assert !@r1.update_attributes(:parent_id =&gt; @r111.id)
-    assert !@r11.update_attributes(:parent_id =&gt; @r111.id)
-    assert @r2.parent_id = @r21.id
+    assert !@r1.update_attributes(:my_parent_id =&gt; @r11.id)
+    assert !@r1.update_attributes(:my_parent_id =&gt; @r111.id)
+    assert !@r11.update_attributes(:my_parent_id =&gt; @r111.id)
+    assert @r2.my_parent_id = @r21.id
     assert !@r2.save
   end
 
   def test_update_positions
-    Category.update_positions({'sortable_categories_0' =&gt; [3,1,2]})
-    assert_equal 1, Category.find(3).position
-    assert_equal 2, Category.find(1).position
-    assert_equal 3, Category.find(2).position
-    Category.update_positions({'sortable_categories_2' =&gt; [6,5]})
-    assert_equal 1, Category.find(6).position
-    assert_equal 2, Category.find(5).position
-    assert_raise(::ArgumentError) { Category.update_positions({'sortable_categories_2' =&gt; [1]}) }
-    assert_raise(::ArgumentError) { Category.update_positions({'sortable_categories_2' =&gt; [1,2,3]}) }
-    assert_raise(::ArgumentError) { Category.update_positions({'sortable_categories_2' =&gt; [5,6,7]}) }
-    assert_raise(::ArgumentError) { Category.update_positions({'sortable_categories_9876543210' =&gt; [1]}) }
-    assert_raise(::ArgumentError) { Category.update_positions({'sortable_categories_1' =&gt; [9876543210]}) }
+    Category.update_positions({'aac_sortable_tree_0' =&gt; [3,1,2]})
+    assert_equal 1, Category.find(3).my_position
+    assert_equal 2, Category.find(1).my_position
+    assert_equal 3, Category.find(2).my_position
+    Category.update_positions({'aac_sortable_tree_2' =&gt; [6,5]})
+    assert_equal 1, Category.find(6).my_position
+    assert_equal 2, Category.find(5).my_position
+    assert_raise(::ArgumentError) { Category.update_positions({'aac_sortable_tree_2' =&gt; [1]}) }
+    assert_raise(::ArgumentError) { Category.update_positions({'aac_sortable_tree_2' =&gt; [1,2,3]}) }
+    assert_raise(::ArgumentError) { Category.update_positions({'aac_sortable_tree_2' =&gt; [5,6,7]}) }
+    assert_raise(::ArgumentError) { Category.update_positions({'aac_sortable_tree_9876543210' =&gt; [1]}) }
+    assert_raise(::ArgumentError) { Category.update_positions({'aac_sortable_tree_1' =&gt; [9876543210]}) }
   end
 
   def get
     assert_equal @r1, Category.get(1)
-    assert @r1.update_attribute('hidden', true)
+    assert @r1.update_attribute('my_hidden', true)
     assert_nil Category.get(1)
     assert_nil Category.get(4)
     assert_nil Category.get(7)</diff>
      <filename>test/acts_as_category_test.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>6f286caffb3632b2a87734114b5c36e880099ffd</id>
    </parent>
  </parents>
  <author>
    <name>Marius Maximus</name>
    <email>nom@ximus.de</email>
  </author>
  <url>http://github.com/funkensturm/acts_as_category/commit/dd316c61891f4c9895bba6d0e7605083ce7cfeae</url>
  <id>dd316c61891f4c9895bba6d0e7605083ce7cfeae</id>
  <committed-date>2008-12-27T15:12:26-08:00</committed-date>
  <authored-date>2008-12-27T15:12:26-08:00</authored-date>
  <message>Added optional memoization (Rails 2.2), repaired unit tests</message>
  <tree>8884ae075cf26ed01234df4b2bb7ab6ebc0a218c</tree>
  <committer>
    <name>Marius Maximus</name>
    <email>nom@ximus.de</email>
  </committer>
</commit>
