Adding ability to use a specific instance of an artboard.
diff --git a/include/rive/artboard.hpp b/include/rive/artboard.hpp
index a7ec00c..e59518f 100644
--- a/include/rive/artboard.hpp
+++ b/include/rive/artboard.hpp
@@ -97,6 +97,10 @@
 		/// longer needed.
 		Artboard* instance() const;
 
+		/// Make an instance of this artboard using a concrete object, allowing
+		/// for inheriting from Artboard to add runtime specific functionality.
+		Artboard* instance(Artboard* instanceObject) const;
+
 		/// Returns true if the artboard is an instance of another
 		bool isInstance() const { return m_IsInstance; }
 	};
diff --git a/src/artboard.cpp b/src/artboard.cpp
index 8840a03..340dc7a 100644
--- a/src/artboard.cpp
+++ b/src/artboard.cpp
@@ -512,11 +512,12 @@
 	return m_StateMachines[index];
 }
 
-Artboard* Artboard::instance() const
+Artboard* Artboard::instance(Artboard* instanceObject) const
 {
-	auto artboardClone = clone()->as<Artboard>();
+	// Must be a fresh instance.
+	assert(instanceObject->m_Objects.empty());
 
-	artboardClone->m_Objects.push_back(artboardClone);
+	instanceObject->m_Objects.push_back(instanceObject);
 
 	// Skip first object (artboard).
 	auto itr = m_Objects.begin();
@@ -524,26 +525,32 @@
 	{
 		auto object = *itr;
 
-		artboardClone->m_Objects.push_back(object == nullptr ? nullptr
-		                                                     : object->clone());
+		instanceObject->m_Objects.push_back(
+		    object == nullptr ? nullptr : object->clone());
 	}
 
 	for (auto animation : m_Animations)
 	{
-		artboardClone->m_Animations.push_back(animation);
+		instanceObject->m_Animations.push_back(animation);
 	}
 	for (auto stateMachine : m_StateMachines)
 	{
-		artboardClone->m_StateMachines.push_back(stateMachine);
+		instanceObject->m_StateMachines.push_back(stateMachine);
 	}
 
-	if (artboardClone->initialize() != StatusCode::Ok)
+	if (instanceObject->initialize() != StatusCode::Ok)
 	{
-		delete artboardClone;
-		artboardClone = nullptr;
+		delete instanceObject;
+		instanceObject = nullptr;
 	}
 
-	artboardClone->m_IsInstance = true;
+	instanceObject->m_IsInstance = true;
 
-	return artboardClone;
+	return instanceObject;
+}
+
+Artboard* Artboard::instance() const
+{
+	auto artboardClone = clone()->as<Artboard>();
+	return instance(artboardClone);
 }
\ No newline at end of file