diff --git a/Polonium.Generators.csproj b/Polonium.Generators.csproj
index daf59ba..2483204 100644
--- a/Polonium.Generators.csproj
+++ b/Polonium.Generators.csproj
@@ -9,7 +9,7 @@
true
true
true
- 0.0.2
+ 0.0.5
Hangman
Polonium.Generators
diff --git a/src/AssetRegisterGenerator.cs b/src/Generators/AssetRegisterGenerator.cs
similarity index 98%
rename from src/AssetRegisterGenerator.cs
rename to src/Generators/AssetRegisterGenerator.cs
index cbad384..3fbdf91 100644
--- a/src/AssetRegisterGenerator.cs
+++ b/src/Generators/AssetRegisterGenerator.cs
@@ -5,7 +5,7 @@ using System.Linq;
using System.Text;
using Microsoft.CodeAnalysis;
-namespace Polonium.Generators;
+namespace Polonium.Generators.Generators;
[Generator]
public class AssetRegisterGenerator : AssetProcessGenerator
{
diff --git a/src/GlobalRegistryGenerator.cs b/src/Generators/GlobalRegistryGenerator.cs
similarity index 98%
rename from src/GlobalRegistryGenerator.cs
rename to src/Generators/GlobalRegistryGenerator.cs
index fdea7ed..239be67 100644
--- a/src/GlobalRegistryGenerator.cs
+++ b/src/Generators/GlobalRegistryGenerator.cs
@@ -1,7 +1,7 @@
using System.Text;
using Microsoft.CodeAnalysis;
-namespace Polonium.Generators;
+namespace Polonium.Generators.Generators;
[Generator]
public class GlobalRegistryGenerator : ISourceGenerator
{
diff --git a/src/Generators/ProxyNodeGenerator.cs b/src/Generators/ProxyNodeGenerator.cs
new file mode 100644
index 0000000..0048ac2
--- /dev/null
+++ b/src/Generators/ProxyNodeGenerator.cs
@@ -0,0 +1,44 @@
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Microsoft.CodeAnalysis;
+
+namespace Polonium.Generators.Generators;
+[Generator]
+public class ProxyNodeGenerator : AssetProcessGenerator
+{
+ private INamedTypeSymbol? NodeProxy { get; set; }
+
+ private IEnumerable ProxyNodesInNamespace(INamespaceSymbol ns)
+ {
+ foreach (INamespaceOrTypeSymbol member in ns.GetMembers())
+ {
+ if (member is INamespaceSymbol nsx)
+ foreach (INamedTypeSymbol nsz in ProxyNodesInNamespace(nsx))
+ yield return nsz;
+ else if (member is INamedTypeSymbol nsu)
+ if (nsu.GetAttributes().Any(attr => SymbolEqualityComparer.Default.Equals(attr.AttributeClass, NodeProxy)))
+ yield return nsu;
+ }
+ }
+
+
+ public override void Execute(GeneratorExecutionContext context)
+ {
+ Compilation compilation = context.Compilation;
+ NodeProxy = compilation.GetTypeByMetadataName("Polonium.Attributes.ProxyNode");
+ foreach (INamedTypeSymbol node in ProxyNodesInNamespace(compilation.GlobalNamespace))
+ {
+ StringBuilder sb = new();
+ sb
+ .AppendLine($"namespace Polonium.Nodes;")
+ .AppendLine("using Godot;")
+ .AppendLine($"[GlobalClass]")
+ .AppendLine($"[Tool]")
+ .AppendLine($"public partial class {node.Name} : {node.ToDisplayString()}")
+ .AppendLine("{")
+ .AppendLine("}");
+ context.AddSource($"NodeProxy_{node.Name}.g.cs", sb.ToString());
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/RegistryEntityGenerator.cs b/src/Generators/RegistryEntityGenerator.cs
similarity index 97%
rename from src/RegistryEntityGenerator.cs
rename to src/Generators/RegistryEntityGenerator.cs
index 9de7a7c..e32b3c6 100644
--- a/src/RegistryEntityGenerator.cs
+++ b/src/Generators/RegistryEntityGenerator.cs
@@ -2,7 +2,7 @@ using System.Linq;
using System.Text;
using Microsoft.CodeAnalysis;
-namespace Polonium.Generators;
+namespace Polonium.Generators.Generators;
[Generator]
public class RegistryEntityGenerator : AssetProcessGenerator
{