if (packageName == null) packageName = DEFAULT_PACKAGE;
	protected PackageSource getProvidersFor(String packageName) {		// first look in the required packages cache		if (requiredPackagesCache != null) {			PackageSource result = (PackageSource) requiredPackagesCache.getByKey(packageName);			if (result != null) {				if (result.isNullSource()) {					return null;				} else {					return result;				}			}		}		// didn't find it in the cache search the actual required bundles		if (requiredBundles == null)			return null;		KeyedHashSet visited = new KeyedHashSet(false);		ArrayList result = new ArrayList(3);		for (int i = 0; i < requiredBundles.length; i++) {			BundleLoader requiredLoader = requiredBundles[i].getBundleLoader();			requiredLoader.addExportedProvidersFor(packageName, result, visited);		}		// found some so cache the result for next time and return		if (requiredPackagesCache == null)			requiredPackagesCache = new KeyedHashSet();		if (result.size() == 0) {			// did not find it in our required bundles lets record the failure			// so we do not have to do the search again for this package.			requiredPackagesCache.add(new NullPackageSource(packageName));			return null;		} else if (result.size() == 1) {			// if there is just one source, remember just the single source			BundleLoaderProxy bundle = (BundleLoaderProxy) result.get(0);			PackageSource source = new SingleSourcePackage(packageName, bundle);			requiredPackagesCache.add(source);			return source;		} else {			// if there was more than one source, build a multisource and cache that.			BundleLoaderProxy[] bundles = (BundleLoaderProxy[]) result.toArray(new BundleLoaderProxy[result.size()]);			MultiSourcePackage source = new MultiSourcePackage(packageName, bundles);			requiredPackagesCache.add(source);			return source;		}	}