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

        public Source(Reference reference) {
            Reference = reference;
        }

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

        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 Source<T> : Source {
        public Source() {
            Reference = null;
        }

        public Source(Reference<T> reference) {
            Reference = reference;
        }

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

        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 SourceImplementation : Implementation {
        public override Type Target => typeof(Source);
        public override void Evaluate(ExecutionContext context, Node node) {
            context.Store[node].SetOutput(0, ((Source)node).Reference.Read());
        }
    }

    public class SourceImplementation<T> : Implementation {
        public override Type Target => typeof(Source<T>);
        public override void Evaluate(ExecutionContext context, Node node) {
            context.Store[node].SetOutput(0, ((Source<T>)node).Reference.Read());
        }
    }
}