Store layer and input as unique_ptrs
diff --git a/include/rive/animation/state_machine.hpp b/include/rive/animation/state_machine.hpp
index 526dd4c..c711878 100644
--- a/include/rive/animation/state_machine.hpp
+++ b/include/rive/animation/state_machine.hpp
@@ -13,16 +13,18 @@
         friend class StateMachineImporter;
 
     private:
-        std::vector<StateMachineLayer*> m_Layers;
-        std::vector<StateMachineInput*> m_Inputs;
-        std::vector<StateMachineEvent*> m_Events;
+        std::vector<std::unique_ptr<StateMachineLayer>> m_Layers;
+        std::vector<std::unique_ptr<StateMachineInput>> m_Inputs;
+        std::vector<std::unique_ptr<StateMachineEvent>> m_Events;
 
-        void addLayer(StateMachineLayer* layer);
-        void addInput(StateMachineInput* input);
-        void addEvent(StateMachineEvent* event);
+        void addLayer(std::unique_ptr<StateMachineLayer>);
+        void addInput(std::unique_ptr<StateMachineInput>);
+        void addEvent(std::unique_ptr<StateMachineEvent>);
 
     public:
+        StateMachine();
         ~StateMachine();
+
         StatusCode import(ImportStack& importStack) override;
 
         size_t layerCount() const { return m_Layers.size(); }
diff --git a/include/rive/importers/state_machine_importer.hpp b/include/rive/importers/state_machine_importer.hpp
index cbfabfe..fb014ce 100644
--- a/include/rive/importers/state_machine_importer.hpp
+++ b/include/rive/importers/state_machine_importer.hpp
@@ -15,9 +15,11 @@
     public:
         StateMachineImporter(StateMachine* machine);
         const StateMachine* stateMachine() const { return m_StateMachine; }
-        void addLayer(StateMachineLayer* layer);
-        void addInput(StateMachineInput* input);
-        void addEvent(StateMachineEvent* event);
+
+        void addLayer(std::unique_ptr<StateMachineLayer>);
+        void addInput(std::unique_ptr<StateMachineInput>);
+        void addEvent(std::unique_ptr<StateMachineEvent>);
+
         StatusCode resolve() override;
         bool readNullObject() override;
     };
diff --git a/src/animation/state_machine.cpp b/src/animation/state_machine.cpp
index 523b4c6..0959b21 100644
--- a/src/animation/state_machine.cpp
+++ b/src/animation/state_machine.cpp
@@ -7,31 +7,23 @@
 
 using namespace rive;
 
-StateMachine::~StateMachine() {
-    for (auto object : m_Inputs) {
-        delete object;
-    }
-    for (auto object : m_Layers) {
-        delete object;
-    }
-    for (auto object : m_Events) {
-        delete object;
-    }
-}
+StateMachine::StateMachine() {}
+
+StateMachine::~StateMachine() {}
 
 StatusCode StateMachine::onAddedDirty(CoreContext* context) {
     StatusCode code;
-    for (auto object : m_Inputs) {
+    for (auto& object : m_Inputs) {
         if ((code = object->onAddedDirty(context)) != StatusCode::Ok) {
             return code;
         }
     }
-    for (auto object : m_Layers) {
+    for (auto& object : m_Layers) {
         if ((code = object->onAddedDirty(context)) != StatusCode::Ok) {
             return code;
         }
     }
-    for (auto object : m_Events) {
+    for (auto& object : m_Events) {
         if ((code = object->onAddedDirty(context)) != StatusCode::Ok) {
             return code;
         }
@@ -41,17 +33,17 @@
 
 StatusCode StateMachine::onAddedClean(CoreContext* context) {
     StatusCode code;
-    for (auto object : m_Inputs) {
+    for (auto& object : m_Inputs) {
         if ((code = object->onAddedClean(context)) != StatusCode::Ok) {
             return code;
         }
     }
-    for (auto object : m_Layers) {
+    for (auto& object : m_Layers) {
         if ((code = object->onAddedClean(context)) != StatusCode::Ok) {
             return code;
         }
     }
-    for (auto object : m_Events) {
+    for (auto& object : m_Events) {
         if ((code = object->onAddedClean(context)) != StatusCode::Ok) {
             return code;
         }
@@ -68,15 +60,22 @@
     return Super::import(importStack);
 }
 
-void StateMachine::addLayer(StateMachineLayer* layer) { m_Layers.push_back(layer); }
+void StateMachine::addLayer(std::unique_ptr<StateMachineLayer> layer) {
+    m_Layers.push_back(std::move(layer));
+}
 
-void StateMachine::addInput(StateMachineInput* input) { m_Inputs.push_back(input); }
-void StateMachine::addEvent(StateMachineEvent* event) { m_Events.push_back(event); }
+void StateMachine::addInput(std::unique_ptr<StateMachineInput> input) {
+    m_Inputs.push_back(std::move(input));
+}
+
+void StateMachine::addEvent(std::unique_ptr<StateMachineEvent> event) {
+    m_Events.push_back(std::move(event));
+}
 
 const StateMachineInput* StateMachine::input(std::string name) const {
-    for (auto input : m_Inputs) {
+    for (auto& input : m_Inputs) {
         if (input->name() == name) {
-            return input;
+            return input.get();
         }
     }
     return nullptr;
@@ -84,15 +83,15 @@
 
 const StateMachineInput* StateMachine::input(size_t index) const {
     if (index < m_Inputs.size()) {
-        return m_Inputs[index];
+        return m_Inputs[index].get();
     }
     return nullptr;
 }
 
 const StateMachineLayer* StateMachine::layer(std::string name) const {
-    for (auto layer : m_Layers) {
+    for (auto& layer : m_Layers) {
         if (layer->name() == name) {
-            return layer;
+            return layer.get();
         }
     }
     return nullptr;
@@ -100,14 +99,14 @@
 
 const StateMachineLayer* StateMachine::layer(size_t index) const {
     if (index < m_Layers.size()) {
-        return m_Layers[index];
+        return m_Layers[index].get();
     }
     return nullptr;
 }
 
 const StateMachineEvent* StateMachine::event(size_t index) const {
     if (index < m_Events.size()) {
-        return m_Events[index];
+        return m_Events[index].get();
     }
     return nullptr;
 }
\ No newline at end of file
diff --git a/src/animation/state_machine_event.cpp b/src/animation/state_machine_event.cpp
index d6a3bc4..9abce0c 100644
--- a/src/animation/state_machine_event.cpp
+++ b/src/animation/state_machine_event.cpp
@@ -18,7 +18,8 @@
     if (stateMachineImporter == nullptr) {
         return StatusCode::MissingObject;
     }
-    stateMachineImporter->addEvent(this);
+    // Handing off ownership of this!
+    stateMachineImporter->addEvent(std::unique_ptr<StateMachineEvent>(this));
     return Super::import(importStack);
 }
 
diff --git a/src/animation/state_machine_input.cpp b/src/animation/state_machine_input.cpp
index 6133a35..7d53c9c 100644
--- a/src/animation/state_machine_input.cpp
+++ b/src/animation/state_machine_input.cpp
@@ -14,6 +14,7 @@
     if (stateMachineImporter == nullptr) {
         return StatusCode::MissingObject;
     }
-    stateMachineImporter->addInput(this);
+    // WOW -- we're handing off ownership of this!
+    stateMachineImporter->addInput(std::unique_ptr<StateMachineInput>(this));
     return Super::import(importStack);
 }
\ No newline at end of file
diff --git a/src/animation/state_machine_layer.cpp b/src/animation/state_machine_layer.cpp
index 363c3f8..594b0e2 100644
--- a/src/animation/state_machine_layer.cpp
+++ b/src/animation/state_machine_layer.cpp
@@ -58,6 +58,7 @@
     if (stateMachineImporter == nullptr) {
         return StatusCode::MissingObject;
     }
-    stateMachineImporter->addLayer(this);
+    // WOW -- we're handing off ownership of this!
+    stateMachineImporter->addLayer(std::unique_ptr<StateMachineLayer>(this));
     return Super::import(importStack);
 }
diff --git a/src/importers/state_machine_importer.cpp b/src/importers/state_machine_importer.cpp
index c223e6a..c6aa5a3 100644
--- a/src/importers/state_machine_importer.cpp
+++ b/src/importers/state_machine_importer.cpp
@@ -1,15 +1,24 @@
 #include "rive/importers/state_machine_importer.hpp"
 #include "rive/animation/state_machine.hpp"
+#include "rive/animation/state_machine_event.hpp"
+#include "rive/animation/state_machine_input.hpp"
+#include "rive/animation/state_machine_layer.hpp"
 
 using namespace rive;
 
 StateMachineImporter::StateMachineImporter(StateMachine* machine) : m_StateMachine(machine) {}
 
-void StateMachineImporter::addLayer(StateMachineLayer* layer) { m_StateMachine->addLayer(layer); }
+void StateMachineImporter::addLayer(std::unique_ptr<StateMachineLayer> layer) {
+    m_StateMachine->addLayer(std::move(layer));
+}
 
-void StateMachineImporter::addInput(StateMachineInput* input) { m_StateMachine->addInput(input); }
+void StateMachineImporter::addInput(std::unique_ptr<StateMachineInput> input) {
+    m_StateMachine->addInput(std::move(input));
+}
 
-void StateMachineImporter::addEvent(StateMachineEvent* event) { m_StateMachine->addEvent(event); }
+void StateMachineImporter::addEvent(std::unique_ptr<StateMachineEvent> event) {
+    m_StateMachine->addEvent(std::move(event));
+}
 
 bool StateMachineImporter::readNullObject() {
     // Hard assumption that we won't add new layer types...