diff --git a/src/libcamera/deviceenumerator.cpp b/src/libcamera/deviceenumerator.cpp
index f4c40bf0376ab453..6d675fc78af8e586 100644
--- a/src/libcamera/deviceenumerator.cpp
+++ b/src/libcamera/deviceenumerator.cpp
@@ -138,6 +138,23 @@ bool DeviceMatch::matchEntities(const std::vector<std::string> &entities) const
  * Enumerator Base
  */
 
+DeviceEnumerator *DeviceEnumerator::create()
+{
+	DeviceEnumerator *enumerator;
+
+	/* TODO: add compile time checks to only try udev enumerator if libudev is available */
+	enumerator = new DeviceEnumeratorUdev();
+	if (!enumerator->init())
+		return enumerator;
+
+	/* NOTE: Either udev is not available or initialization of it
+	 * failed, use/fallback on sysfs enumerator */
+
+	/* TODO: add a sysfs based enumerator */
+
+	return NULL;
+}
+
 DeviceEnumerator::~DeviceEnumerator()
 {
 	for (DeviceInfo *dev : devices_) {
diff --git a/src/libcamera/include/deviceenumerator.h b/src/libcamera/include/deviceenumerator.h
index 2c7ff3f336ba127d..6aa6e59d4a8a9729 100644
--- a/src/libcamera/include/deviceenumerator.h
+++ b/src/libcamera/include/deviceenumerator.h
@@ -59,6 +59,8 @@ private:
 class DeviceEnumerator
 {
 public:
+	static DeviceEnumerator *create();
+
 	virtual ~DeviceEnumerator();
 
 	virtual int init() = 0;
