using GObject.Plugins;

namespace GObject.Plugins {

	public interface IPlugabble : Object {
		public abstract string get_name ();
	}

	public abstract class Plugin : Object, IPlugabble {
		public abstract string get_name ();
	}

	public abstract class PluginTypeA : Plugin {
		// don't write anything here
	}

	public class PluginTypeA1 : PluginTypeA {
		public override string get_name () { return "Any object of PluginTypeA1 class"; }
	}

	public class Module {
		Type t;

		public Module (Type t) {
			this.t = t;
		}

		public IPlugabble create_instance () {
			return Object.new (t) as IPlugabble;
		}
	}
}

void main () {
	var m = new Module (typeof (PluginTypeA1));
	var o = m.create_instance ();
	stdout.printf ("o.get_name () = %s", o.get_name ());
}
