CflowPointcut.clearCaches();
    public void prepareForWeave() {    	needToReweaveWorld = false;    	    	// update mungers    	for (Iterator i = addedClasses.iterator(); i.hasNext(); ) {     		UnwovenClassFile jc = (UnwovenClassFile)i.next();    		String name = jc.getClassName();    		ResolvedTypeX type = world.resolve(name);    		//System.err.println("added: " + type + " aspect? " + type.isAspect());    		if (type.isAspect()) {    			needToReweaveWorld |= xcutSet.addOrReplaceAspect(type);    		}    	}    	for (Iterator i = deletedTypenames.iterator(); i.hasNext(); ) {     		String name = (String)i.next();    		if (xcutSet.deleteAspect(TypeX.forName(name))) needToReweaveWorld = true;    	}		shadowMungerList = xcutSet.getShadowMungers();		typeMungerList = xcutSet.getTypeMungers();		declareParentsList = xcutSet.getDeclareParents();    			//XXX this gets us a stable (but completely meaningless) order		Collections.sort(			shadowMungerList, 			new Comparator() {				public int compare(Object o1, Object o2) {					return o1.toString().compareTo(o2.toString());				}			});    }