diff --git a/src/core/scene.c b/src/core/scene.c
index f0c28f1..d3dded2 100644
--- a/src/core/scene.c
+++ b/src/core/scene.c
@@ -165,6 +165,16 @@ SceneNodeEntity SceneNodeDetachEntity(SceneNode *self) {
     return e;
 }
 
+SceneNode *SceneNodeGetChildByTypeclass(SceneNode *self, char const *typeclass, bool recurse) {
+    list_foreach(SceneNode **,child, &self->children) {
+        SceneNodeEntity entity = (*child)->entity;
+        if(mirror_get_function(entity.data, entity.mirror, typeclass))
+            return *child;
+        if(recurse)
+            SceneNodeGetChildByTypeclass(*child, typeclass, recurse);
+    }
+}
+
 Scene *CreateScene(SceneNode *root) {
     Scene *scene = new(Scene);
     ASSERT_RETURN(scene != NULL, NULL, "CreateScene: Failed to allocate scene");
diff --git a/src/core/scene.h b/src/core/scene.h
index d026d02..5ce6340 100644
--- a/src/core/scene.h
+++ b/src/core/scene.h
@@ -2,6 +2,7 @@
 #define SCENE_H
 
 #include "stddef.h"
+#include "stdbool.h"
 #include "scene_node_entity.h"
 #include "utils/list.h"
 #include "utils/typeclass_helpers.h"
@@ -40,6 +41,9 @@ extern void SceneNodeRemoveChild(SceneNode *self, SceneNode *child);
 extern void SceneNodeAttachEntity(SceneNode *self, SceneNodeEntity entity);
 //! Detach an entity from a scene node
 extern SceneNodeEntity SceneNodeDetachEntity(SceneNode *self);
+//! Returns the first child node that implements a specific typeclass.
+//! Optionally recurses through the entire branch
+extern SceneNode *SceneNodeGetChildByTypeclass(SceneNode *self, char const *typeclass, bool recurse);
 
 //! Instantiate a new scene with a root node.
 extern Scene *CreateScene(SceneNode *root);