<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -6,38 +6,38 @@ This plugin uses an acts_as_tree model and creates a breadcrumbs trail attribute
 
 === Homepage
 
-* http://actsasflinn.com/some_post_to_come
+* http://github.com/actsasflinn/acts_as_breadcrumbs
 
 === Installation
 
-* script/plugin install svn://rubyforge.org/var/svn/phillyonrails/acts_as_breadcrumbs/trunk
+* script/plugin install git://github.com/actsasflinn/acts_as_breadcrumbs.git
 
 === Requirements
 
-* acts_as_tree - The model has to acts_as_tree!
+* awesome_nested_set http://github.com/collectiveidea/awesome_nested_set
 
 == Examples
 
 class WebPage &lt; ActiveRecord::Base
-  acts_as_tree
-  acts_as_breadcrumbs(:attr =&gt; :url, :basename =&gt; :slug, :separator =&gt; &quot;/&quot;)
-  acts_as_breadcrumbs(:basename =&gt; :title, :separator =&gt; &quot;&amp;nbsp;&amp;gt;&amp;nbsp;&quot;)
+  acts_as_nested_set
+  acts_as_breadcrumbs :url, :basename =&gt; :slug, :separator =&gt; &quot;/&quot;
+  acts_as_breadcrumbs :basename =&gt; :title, :separator =&gt; &quot;&amp;nbsp;&amp;gt;&amp;nbsp;&quot;
 end
 
-web_page.urls        #=&gt; &quot;foo/bar/baz&quot;
+web_page.url         #=&gt; &quot;foo/bar/baz&quot;
 
 web_page.breadcrumbs #=&gt; &quot;Foo&amp;nbsp;&amp;gt;&amp;nbsp;Bar&amp;nbsp;&amp;gt;&amp;nbsp;Baz&quot;
 
 class Location &lt; ActiveRecord::Base
-  acts_as_tree
-  acts_as_breadcrumbs(:attr =&gt; :location_string)
+  acts_as_nested_set
+  acts_as_breadcrumbs :location_string
 end
 
 location.location_string #=&gt; &quot;HQ:FL01:RM03&quot;
 
 class Soldier &lt; ActiveRecord::Base
-  acts_as_tree
-  acts_as_breadcrumbs(:attr =&gt; :chain_o_command, :separator =&gt; &quot; &gt; &quot;)
+  acts_as_nested_set
+  acts_as_breadcrumbs :chain_o_command, :separator =&gt; &quot; &gt; &quot;
 end
 
 soldier.chain_o_command #=&gt; &quot;General Hailstone &gt; Colonel Stanley &gt; LTC Mueller&quot;</diff>
      <filename>README</filename>
    </modified>
    <modified>
      <diff>@@ -1,4 +1,4 @@
-# Copyright (c) 2007 Flinn Mueller
+# Copyright (c) 2007-2009 Flinn Mueller
 # Released under the MIT License.  See the MIT-LICENSE file for more details.
 
 module ActiveRecord #:nodoc:
@@ -9,10 +9,10 @@ module ActiveRecord #:nodoc:
     # attribute based on a base attribute.
     module Breadcrumbs
       def self.included(base) # :nodoc:
-        base.extend ClassMethods
+        base.extend Crummy
       end
 
-      module ClassMethods
+      module Crummy
         # acts_as_breadcrumbs creates a cached trail of breadcrumbs based
         # on acts_as_tree methods, parent and children
         #
@@ -25,65 +25,63 @@ module ActiveRecord #:nodoc:
         # Examples:
         #
         # class WebPage &lt; ActiveRecord::Base
-        #   acts_as_breadcrumbs(:attr =&gt; :url, :basename =&gt; :slug, :separator =&gt; &quot;/&quot;)
-        #   acts_as_breadcrumbs(:basename =&gt; :title, :separator =&gt; &quot;&amp;nbsp;&amp;gt;&amp;nbsp;&quot;)
+        #   acts_as_breadcrumbs :url, :basename =&gt; :slug, :separator =&gt; &quot;/&quot;
+        #   acts_as_breadcrumbs :basename =&gt; :title, :separator =&gt; &quot;&amp;nbsp;&amp;gt;&amp;nbsp;&quot;
         # end
         #
-        # web_page.urls        #=&gt; &quot;foo/bar/baz&quot;
+        # web_page.url         #=&gt; &quot;foo/bar/baz&quot;
         # web_page.breadcrumbs #=&gt; &quot;Foo&amp;nbsp;&amp;gt;&amp;nbsp;Bar&amp;nbsp;&amp;gt;&amp;nbsp;Baz&quot; # &quot;Foo &gt; Bar &gt; Baz&quot;
         #
         # class Location &lt; ActiveRecord::Base
-        #   acts_as_breadcrumbs(:attr =&gt; :location_string)
+        #   acts_as_breadcrumbs :location_string
         # end
         #
         # location.location_string #=&gt; &quot;HQ:FL01:RM03&quot;
         #
         # class Soldier &lt; ActiveRecord::Base
-        #   acts_as_breadcrumbs(:attr =&gt; :chain_o_command, :separator =&gt; &quot; &gt; &quot;)
+        #   acts_as_breadcrumbs :chain_o_command, :separator =&gt; &quot; &gt; &quot;
         # end
         #
         # soldier.chain_o_command #=&gt; &quot;General Hailstone &gt; Colonel Stanley &gt; LTC Mueller&quot;
         #
-        def acts_as_breadcrumbs(options = {})
-          breadcrumbs_attr = options.delete(:attr) || :breadcrumbs
-          breadcrumbs_basename = options.delete(:basename) || :name
-          breadcrumbs_separator = options.delete(:separator) || &quot;:&quot;
-          breadcrumbs_include_root = options.include?(:include_root) ? options.delete(:include_root) : true
+        def acts_as_breadcrumbs(*args)
+          include InstanceMethods
 
-          # Creates a breadcrumb string based on an acts_as_tree model
-          create = &quot;
-            def create_breadcrumb_#{breadcrumbs_attr}
-              trail = self.ancestors.collect(&amp;:#{breadcrumbs_basename})
-              trail.reverse!
-              trail &lt;&lt; self.#{breadcrumbs_basename}
-              trail.shift unless #{breadcrumbs_include_root}
-              self.#{breadcrumbs_attr} = trail.join(\&quot;#{breadcrumbs_separator}\&quot;)
-            end
-          &quot;
+          options = args.extract_options!
+          options.reverse_merge!({ :basename =&gt; :name, :separator =&gt; &quot;:&quot;, :include_root =&gt; true })
+          attribute = args.first || :breadcrumbs
 
-          # Updates all this records's child breadcrumb strings
-          # Go through each child, update the breadcrumb,
-          # if it's different from the stored breadcrumb then save
-          # then do the same of all of it's children
-          update = &quot;
-            def update_breadcrumb_#{breadcrumbs_attr}
-              children.each do |c|
-                old_breadcrumbs = c.#{breadcrumbs_attr}
-                c.create_breadcrumb_#{breadcrumbs_attr}
-                c.save unless old_breadcrumbs == c.#{breadcrumbs_attr}
-                c.update_breadcrumb_#{breadcrumbs_attr}
-              end
-            end
-          &quot;
+          self.send(:before_save, proc{ |record| record.set_breadcrumb_for(attribute, options) })
+          self.send(:after_save, proc{ |record| record.update_breadcrumb_for(attribute, options) })
+        end
+      end
+
+      module InstanceMethods
+        def breadcrumb_for(attribute, options = {})
+          crumbs = []
 
-          save_callbacks = &quot;
-            before_save :create_breadcrumb_#{breadcrumbs_attr}
-            after_save :update_breadcrumb_#{breadcrumbs_attr}
-          &quot;
+          if self.root?
+            crumbs &lt;&lt; self.send(options[:basename]) if options[:include_root]
+          else
+            crumbs &lt;&lt; self.send(options[:basename])
+            crumbs &lt;&lt; self.parent.send(attribute)
+          end
 
-          self.class_eval(create)
-          self.class_eval(update)
-          self.class_eval(save_callbacks)
+          crumbs = crumbs.collect{ |crumb| crumb unless crumb.blank? }.compact
+          crumbs.reverse.join(options[:separator])
+        end
+
+        def set_breadcrumb_for(attribute, options = {})
+          crumb = breadcrumb_for(attribute, options)
+          self.send(&quot;#{attribute}=&quot;.to_sym, crumb) unless crumb.blank?
+        end
+
+        def update_breadcrumb_for(attribute, options = {})
+          if self.send(&quot;#{options[:basename]}_changed?&quot;.to_sym)
+            descendants.each do |node|
+              node.class.update_all({ attribute =&gt; node.breadcrumb_for(attribute, options) }, :id =&gt; node.id)
+            end
+          end
         end
 
       end</diff>
      <filename>lib/acts_as_breadcrumbs.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,62 +1,81 @@
 require File.join(File.dirname(__FILE__), 'test_helper')
 
 class Node &lt; ActiveRecord::Base
-  acts_as_tree  # need this
+  acts_as_nested_set  # need this
   acts_as_breadcrumbs
 end
 
 class Location &lt; ActiveRecord::Base
-  acts_as_tree  # need this
-  acts_as_breadcrumbs(:attr =&gt; :location_string)
+  acts_as_nested_set  # need this
+  acts_as_breadcrumbs :location_string
 end
 
 class Soldier &lt; ActiveRecord::Base
-  acts_as_tree  # need this
-  acts_as_breadcrumbs(:attr =&gt; :chain_o_command, :separator =&gt; &quot; &gt; &quot;, :include_root =&gt; false)
+  acts_as_nested_set  # need this
+  acts_as_breadcrumbs :chain_o_command, :separator =&gt; &quot; &gt; &quot;, :include_root =&gt; false
 end
 
 class WebPage &lt; ActiveRecord::Base
-  acts_as_tree  # need this
-  acts_as_breadcrumbs(:attr =&gt; :url, :basename =&gt; :slug, :separator =&gt; &quot;/&quot;)
-  acts_as_breadcrumbs(:basename =&gt; :title, :separator =&gt; &quot;&amp;nbsp;&amp;gt;&amp;nbsp;&quot;)
+  acts_as_nested_set  # need this
+  acts_as_breadcrumbs :url, :basename =&gt; :slug, :separator =&gt; &quot;/&quot;
+  acts_as_breadcrumbs :basename =&gt; :title, :separator =&gt; &quot;&amp;nbsp;&amp;gt;&amp;nbsp;&quot;
+
+  def slug
+    title.parameterize.to_s
+  end
 end
 
 class BreadcrumbsTest &lt; Test::Unit::TestCase
-  fixtures :nodes, :locations, :soldiers, :web_pages
-
   def test_no_options
-    nodes(:node_3).save
-    assert_equal &quot;Root:Level 1:Level 2&quot;, nodes(:node_3).breadcrumbs    
+    root = Node.create(:name =&gt; &quot;Root&quot;)
+    child1 = root.children.create(:name =&gt; &quot;Level 1&quot;)
+    child2 = child1.children.create(:name =&gt; &quot;Level 2&quot;)
+    root2 = Node.create(:name =&gt; &quot;Root 2&quot;)
+
+    assert_equal &quot;Root:Level 1:Level 2&quot;, child2.breadcrumbs    
   end
 
   def test_alternate_attribute
-    locations(:location_3).save
-    assert_equal &quot;HQ:FL01:RM03&quot;, locations(:location_3).location_string
+    root = Location.create(:name =&gt; &quot;HQ&quot;)
+    child1 = root.children.create(:name =&gt; &quot;FL01&quot;)
+    child2 = child1.children.create(:name =&gt; &quot;RM03&quot;)
+
+    assert_equal &quot;HQ:FL01:RM03&quot;, child2.location_string
   end
 
   def test_basename
-    web_pages(:web_page_3).save
-    assert_equal &quot;foo/bar/baz&quot;, web_pages(:web_page_3).url
+    root = WebPage.create(:title =&gt; &quot;Foo&quot;)
+    child1 = root.children.create(:title =&gt; &quot;Bar&quot;)
+    child2 = child1.children.create(:title =&gt; &quot;Baz&quot;)
+
+    assert_equal &quot;foo/bar/baz&quot;, child2.url
   end
 
   def test_separator
-    soldiers(:soldier_4).save
-    assert_equal &quot;General Hailstone &gt; Colonel Stanley &gt; LTC Mueller&quot;, soldiers(:soldier_4).chain_o_command
+    root = Soldier.create(:name =&gt; &quot;President Paul&quot;)
+    child1 = root.children.create(:name =&gt; &quot;General Hailstone&quot;)
+    child2 = child1.children.create(:name =&gt; &quot;Colonel Stanley&quot;)
+    child3 = child2.children.create(:name =&gt; &quot;LTC Mueller&quot;)
+
+    assert_equal &quot;General Hailstone &gt; Colonel Stanley &gt; LTC Mueller&quot;, child3.chain_o_command
   end
 
   def test_include_root
-    locations(:location_1).save
-    assert_equal &quot;HQ&quot;, locations(:location_1).location_string    
+    root = Location.create(:name =&gt; &quot;HQ&quot;)
+    assert_equal &quot;HQ&quot;, root.location_string    
   end
 
   def test_not_include_root
-    soldiers(:soldier_1).save
-    assert_equal &quot;&quot;, soldiers(:soldier_1).chain_o_command
+    root = Soldier.create(:name =&gt; &quot;President Paul&quot;)
+    assert_equal &quot;&quot;, root.chain_o_command
   end
 
   def test_two_breadcrumbs
-    web_pages(:web_page_3).save
-    assert_equal &quot;foo/bar/baz&quot;, web_pages(:web_page_3).url
-    assert_equal &quot;Foo&amp;nbsp;&amp;gt;&amp;nbsp;Bar&amp;nbsp;&amp;gt;&amp;nbsp;Baz&quot;, web_pages(:web_page_3).breadcrumbs
+    root = WebPage.create(:title =&gt; &quot;Foo&quot;)
+    child1 = root.children.create(:title =&gt; &quot;Bar&quot;)
+    child2 = child1.children.create(:title =&gt; &quot;Baz&quot;)
+
+    assert_equal &quot;foo/bar/baz&quot;, child2.url
+    assert_equal &quot;Foo&amp;nbsp;&amp;gt;&amp;nbsp;Bar&amp;nbsp;&amp;gt;&amp;nbsp;Baz&quot;, child2.breadcrumbs
   end
 end
\ No newline at end of file</diff>
      <filename>test/breadcrumbs_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,9 +1,9 @@
 sqlite:
   :adapter: sqlite
-  :dbfile: acts_as_breadcrumbs_plugin.sqlite.db
+  :database: acts_as_breadcrumbs_plugin.sqlite.db
 sqlite3:
   :adapter: sqlite3
-  :dbfile: acts_as_breadcrumbs_plugin.sqlite3.db
+  :database: acts_as_breadcrumbs_plugin.sqlite3.db
 postgresql:
   :adapter: postgresql
   :username: postgres</diff>
      <filename>test/database.yml</filename>
    </modified>
    <modified>
      <diff>@@ -1,29 +1,43 @@
 ActiveRecord::Schema.define(:version =&gt; 1) do
-
   create_table :nodes, :force =&gt; true do |t|
-    t.column :parent_id, :integer
-    t.column :name, :string
-    t.column :breadcrumbs, :string
+    t.string :name
+    t.string :breadcrumbs
+
+    # nested_set
+    t.integer :parent_id
+    t.integer :lft
+    t.integer :rgt
   end
 
   create_table :locations, :force =&gt; true do |t|
-    t.column :parent_id, :integer
-    t.column :name, :string
-    t.column :location_string, :string
+    t.string :name
+    t.string :location_string
+
+    # nested_set
+    t.integer :parent_id
+    t.integer :lft
+    t.integer :rgt
   end
 
   create_table :soldiers, :force =&gt; true do |t|
-    t.column :parent_id, :integer
-    t.column :name, :string
-    t.column :chain_o_command, :string
+    t.string :name
+    t.string :chain_o_command
+
+    # nested_set
+    t.integer :parent_id
+    t.integer :lft
+    t.integer :rgt
   end
 
   create_table :web_pages, :force =&gt; true do |t|
-    t.column :parent_id, :integer
-    t.column :title, :string
-    t.column :slug, :string
-    t.column :url, :string
-    t.column :breadcrumbs, :string
-  end
+    t.string :title
+    t.string :slug
+    t.string :url
+    t.string :breadcrumbs
 
+    # nested_set
+    t.integer :parent_id
+    t.integer :lft
+    t.integer :rgt
+  end
 end
\ No newline at end of file</diff>
      <filename>test/schema.rb</filename>
    </modified>
    <modified>
      <diff>@@ -3,32 +3,10 @@ $:.unshift(File.dirname(__FILE__) + '/../lib')
 require 'test/unit'
 require File.expand_path(File.join(File.dirname(__FILE__), '../../../../config/environment.rb'))
 require 'rubygems'
-require 'active_support/breakpoint'
 require 'active_record/fixtures'
+require 'test_help'
 
 config = YAML::load(IO.read(File.dirname(__FILE__) + '/database.yml'))
 ActiveRecord::Base.logger = Logger.new(File.dirname(__FILE__) + &quot;/debug.log&quot;)
-ActiveRecord::Base.establish_connection(config[ENV['DB'] || 'sqlite'])
-
+ActiveRecord::Base.establish_connection(config[ENV['DB'] || 'sqlite3'])
 load(File.dirname(__FILE__) + &quot;/schema.rb&quot;)
-
-Test::Unit::TestCase.fixture_path = File.dirname(__FILE__) + &quot;/fixtures/&quot;
-$LOAD_PATH.unshift(Test::Unit::TestCase.fixture_path)
-
-class Test::Unit::TestCase #:nodoc:
-  def create_fixtures(*table_names)
-    if block_given?
-      Fixtures.create_fixtures(Test::Unit::TestCase.fixture_path, table_names) { yield }
-    else
-      Fixtures.create_fixtures(Test::Unit::TestCase.fixture_path, table_names)
-    end
-  end
-
-  # Turn off transactional fixtures if you're working with MyISAM tables in MySQL
-  self.use_transactional_fixtures = true
-  
-  # Instantiated fixtures are slow, but give you @david where you otherwise would need people(:david)
-  self.use_instantiated_fixtures  = false
-
-  # Add more helper methods to be used by all tests here...
-end
\ No newline at end of file</diff>
      <filename>test/test_helper.rb</filename>
    </modified>
  </modified>
  <removed type="array">
    <removed>
      <filename>test/fixtures/locations.yml</filename>
    </removed>
    <removed>
      <filename>test/fixtures/nodes.yml</filename>
    </removed>
    <removed>
      <filename>test/fixtures/soldiers.yml</filename>
    </removed>
    <removed>
      <filename>test/fixtures/web_pages.yml</filename>
    </removed>
  </removed>
  <parents type="array">
    <parent>
      <id>87f2daefa021ad6c48acd2f550a386f76fab66dd</id>
    </parent>
  </parents>
  <author>
    <name>Flinn</name>
    <email>flinn@actsasflinn.com</email>
  </author>
  <url>http://github.com/actsasflinn/acts_as_breadcrumbs/commit/f6298840701ac5f001dac7380d7f9e2e83c8797c</url>
  <id>f6298840701ac5f001dac7380d7f9e2e83c8797c</id>
  <committed-date>2009-11-05T23:21:17-08:00</committed-date>
  <authored-date>2009-11-05T23:21:17-08:00</authored-date>
  <message>update to use awesome_nested_set</message>
  <tree>70d1c88f6dd8af8f2b36ec59dd2cfb12afc9e444</tree>
  <committer>
    <name>Flinn</name>
    <email>flinn@actsasflinn.com</email>
  </committer>
</commit>
