public abstract class Plugin<T> where T : new()
private static readonly Lazy<T> val = new Lazy<T>(() => new T());
public static T Instance { get { return val.Value; } }
public abstract string plugin_name();
public class Main : Plugin<Main> {
public override string plugin_name() { return "a test plugin"; }
public static void Main()
Console.WriteLine(global::Main.Instance.plugin_name());