Code/Nodes/Core/Drive.cs
namespace Nodebox.Nodes {
    [Description("Continuously writes to a property")]
    [Tag("Core")]
    [ExecutionContext.Writer]
    [Hide]
    public class Drive : Node {
        public Drive() : base() {
            Reference = null;
        }

        public Drive(Reference reference) : base() {
            Reference = reference;
        }

        public override (List<Pin>, List<Pin>) InitialPins => (
            [
                Pin.New<object>("*").WithHideInput(true)
            ],
            []
        );

        public Reference Reference { get; set; }

        public override void SetProperty(string name, object obj) {
            if (name == nameof(Reference)) {
                Reference = (Reference)obj;
            }
        }
    }

    [Hide]
    // [Collection.IsPolymorphOf(typeof(Source))]
    public class Drive<T> : Drive {
        public Drive() : base() {
            Reference = null;
        }

        public Drive(Reference<T> reference) : base() {
            Reference = reference;
        }

        public override (List<Pin>, List<Pin>) InitialPins => (
            [
                Pin.New<T>("*").WithHideInput(true)
            ],
            []
        );

        public new Reference<T> Reference {
            get => (Reference<T>)base.Reference;
            set => base.Reference = value;
        }

        public override void SetProperty(string name, object obj) {
            if (name == nameof(Reference)) {
                Reference = (Reference<T>)obj;
            }
        }
    }
}

namespace Nodebox.Execution {
    using Nodebox.Nodes;
    using static ExecutionContext;


    public class DriveImplementation : Implementation {
        public override Type Target => typeof(Drive);
        public override void Evaluate(ExecutionContext context, Node node) {
            if (!node.InputWires[0].Any()) { return; }
            ((Drive)node).Reference.Write(context.Store[node].GetInput<object>(0));
        }
    }

    public class DriveImplementation<T> : Implementation {
        public override Type Target => typeof(Drive<T>);
        public override void Evaluate(ExecutionContext context, Node node) {
            if (!node.InputWires[0].Any()) { return; }
            ((Drive<T>)node).Reference.Write(context.Store[node].GetInput<T>(0));
        }
    }
}