protected Class<?> findImpl(final Class<T> iface) {

		Package pkg = iface.getPackage();
		String pkgName = (pkg != null) ? pkg.getName() : DEFAULT_PACKAGE_NAME;
		String clsName = iface.getSimpleName();
		Class<?> implClass = null;

		// look up in the following orders
		// 1. package.name.ClassNameImpl
		// 2. package.name.impl.ClassNameImpl
		// 3. package.name.impl.ClassName
		// 4. package.name.DefaultClassName
		// 5. package.name.DefaultHandler
		String[] lookups = { pkgName + "." + clsName + "Impl",
				pkgName + ".impl." + clsName + "Impl",
				pkgName + ".impl." + clsName,
				pkgName + "." + "Default" + clsName,
				pkgName + "." + "DefaultHandler" };

		try {
			implClass = new ClassNameLookup(lookups,
					new LookupFilter<Class<?>>() {

						@Override
						public boolean accept(Class<?> found) {
							return found != null
									&& iface.isAssignableFrom(found);
						}
					}).lookup();
		} catch (NotFound e) {
			// ignore
		}

		return implClass;
	}