public class Foo.PluginModule : TypeModule { [CCode (has_target = false)] private delegate Type PluginInit (TypeModule type_module); public string? directory { get; construct; default = null; } public string name { get; construct; } public string path { get; construct; } public Type plugin_type { get; private set; } private Module? module = null; public PluginModule (string? directory, string name) { Object (directory: directory, name: name); } construct { path = Module.build_path (directory, name); } public override bool load () { module = Module.open (path, ModuleFlags.BIND_LAZY); if (module == null) { critical (Module.error ()); return false; } void* plugin_init; if (!module.symbol ("plugin_init", out plugin_init)){ critical (Module.error ()); return false; } if (plugin_init == null) { return false; } plugin_type = ((PluginInit) plugin_init) (this); if (!plugin_type.is_a (typeof (Plugin))) { return false; } return true; } public override void unload () { module = null; } }