return NS_OK;
nsXULTemplateBuilder::Retract(nsIRDFResource* aSource,                              nsIRDFResource* aProperty,                              nsIRDFNode* aTarget){    // Retract any currently active rules that will no longer be    // matched.    NodeSet::ConstIterator lastnode = mRDFTests.Last();    for (NodeSet::ConstIterator node = mRDFTests.First(); node != lastnode; ++node) {        const RDFTestNode* rdftestnode = NS_STATIC_CAST(const RDFTestNode*, *node);        MatchSet firings;        MatchSet retractions;        rdftestnode->Retract(aSource, aProperty, aTarget, firings, retractions);        {            MatchSet::Iterator last = retractions.Last();            for (MatchSet::Iterator match = retractions.First(); match != last; ++match) {                Value memberval;                match->mAssignments.GetAssignmentFor(match->mRule->GetMemberVariable(), &memberval);                Value contentval;                match->mAssignments.GetAssignmentFor(mContentVar, &contentval);                nsIContent* content = VALUE_TO_ICONTENT(contentval);                if (! content)                    continue;                RemoveMember(content, VALUE_TO_IRDFRESOURCE(memberval), PR_TRUE);                // Update the 'empty' attribute                SetContainerAttrs(content, match.operator->());            }        }        // Now fire any newly revealed rules        {            MatchSet::ConstIterator last = firings.Last();            for (MatchSet::ConstIterator match = firings.First(); match != last; ++match) {                // XXXwaterson yo. write me.            }        }    }    return NS_OK;}