/WebThingPlugin.cs
using System;
using System.Collections.Generic;
using WebKit;

namespace bytex64.WebThing {
    public abstract class WebThingPlugin {
        protected Dictionary<string,string> Options;

        public WebThingPlugin() {
            string classname = this.GetType().FullName;

            if (Config.PluginOptions.ContainsKey(classname)) {
                Options = Config.PluginOptions[classname];
            } else {
                Options = new Dictionary<string,string>();
                Config.PluginOptions[classname] = Options;
            }
        }

        // Convenience function to easily save plugin configuration
        protected void SaveConfig() {
            if (Config.ConfigPathOut == null) return;

            string plugin_name = this.GetType().FullName;
            Config.SaveFile(plugin_name, String.Format("{0}/{1}.conf", Config.ConfigPathOut, plugin_name));
        }

        // Plugin life cycle
        public virtual void Init(WebThing wt) {}
        public virtual void Deinit(WebThing wt) {}

        // WebView life cycle
        public virtual void InitWebView(WebView wv) {}
        public virtual void DeinitWebView(WebView wv) {}
    }

    // An interface implemented by plugins that handle search queries
    // (a search query is anything that doesn't look like a URI)
    public interface ISearchPlugin {
        // Convert a search query into a URI.  If this plugin cannot
        // handle the search, it should return null.
        string SearchTransform(string search);
    }
}