diff --git a/src/libcamera/device_enumerator.cpp b/src/libcamera/device_enumerator.cpp
index 3cafd0d3703dac99..26a3e68fcf39e43a 100644
--- a/src/libcamera/device_enumerator.cpp
+++ b/src/libcamera/device_enumerator.cpp
@@ -121,6 +121,25 @@ bool DeviceMatch::match(const DeviceInfo *info) 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 nullptr;
+}
+
 DeviceEnumerator::~DeviceEnumerator()
 {
 	for (DeviceInfo *dev : devices_) {
diff --git a/src/libcamera/include/device_enumerator.h b/src/libcamera/include/device_enumerator.h
index 5348e6cf583dbd15..24bca0e3fc32c377 100644
--- a/src/libcamera/include/device_enumerator.h
+++ b/src/libcamera/include/device_enumerator.h
@@ -56,6 +56,8 @@ private:
 class DeviceEnumerator
 {
 public:
+	static DeviceEnumerator *create();
+
 	virtual ~DeviceEnumerator();
 
 	virtual int init() = 0;
