Index: /branches/release-38/lib/MT/Category.pm
===================================================================
--- /branches/release-38/lib/MT/Category.pm (revision 2275)
+++ /branches/release-38/lib/MT/Category.pm (revision 2314)
@@ -9,4 +9,5 @@
 use strict;
 use base qw( MT::Object );
+use MT::Util qw( weaken );
 
 use MT::Blog;
@@ -76,7 +77,6 @@
     return $cat->{__path} if exists $cat->{__path};
     my $result = $cat->basename;
+    my $orig = $cat;
     do {
-        # TODO: uh, does this not mean we cache the resulting path on the
-        # root category object instead?
         $cat = $cat->parent ? __PACKAGE__->load($cat->parent) : undef;
         $result = join "/", $cat->basename, $result if $cat;
@@ -84,5 +84,5 @@
     # caching this information may be problematic IF
     # parent category basenames are changed.
-    $cat->{__path} = $result;
+    $orig->{__path} = $result;
 }
 *category_path = \&publish_path;
@@ -92,4 +92,5 @@
     return $cat->{__label_path} if exists $cat->{__label_path};
     my $result = $cat->label =~ m!/! ? '[' . $cat->label . ']' : $cat->label;
+    my $orig = $cat;
     do {
         $cat = $cat->parent ? __PACKAGE__->load($cat->parent) : undef;
@@ -99,5 +100,5 @@
     # caching this information may be problematic IF
     # parent category labels are changed.
-    $cat->{__label_path} = $result;
+    $orig->{__label_path} = $result;
 }
 
@@ -389,4 +390,5 @@
     unless ($cat->{__parent_category}) {
         $cat->{__parent_category} = ($cat->parent) ? $class->load($cat->parent) : undef;
+        weaken( $cat->{__parent_category} );
     }
     $cat->{__parent_category};
@@ -400,4 +402,5 @@
         $class->load({ blog_id => $cat->blog_id,
             parent => $cat->id });
+        weaken( $_ ) foreach @{ $cat->{__children} };
     }
     @{$cat->{__children}};
