[hb-info] Simplify
diff --git a/util/hb-info.cc b/util/hb-info.cc
index 20e0d32..42adf4b 100644
--- a/util/hb-info.cc
+++ b/util/hb-info.cc
@@ -57,10 +57,14 @@
   *text_size = len;
 }
 
-struct info_t
+struct info_t :
+       option_parser_t,
+       font_options_t
 {
-  void add_options (option_parser_t *parser)
+  void add_options ()
   {
+    font_options_t::add_options (this);
+
     GOptionEntry misc_entries[] =
     {
       {"direction",	0, 0, G_OPTION_ARG_STRING,	&this->direction_str,		"Set direction (default: ltr)",		"ltr/rtl/ttb/btt"},
@@ -71,12 +75,12 @@
 
       {nullptr}
     };
-    parser->add_group (misc_entries,
-		       "misc",
-		       "Miscellaneaous options:",
-		       "Miscellaneaous options affecting queries",
-		       this,
-		       false /* We add below. */);
+    add_group (misc_entries,
+	       "misc",
+	       "Miscellaneaous options:",
+	       "Miscellaneaous options affecting queries",
+	       this,
+	       false /* We add below. */);
 
     GOptionEntry query_entries[] =
     {
@@ -121,18 +125,46 @@
 
       {nullptr}
     };
-    parser->add_group (query_entries,
-		       "query",
-		       "Query options:",
-		       "Options to query the font instance",
-		       this,
-		       true);
+    add_group (query_entries,
+	       "query",
+	       "Query options:",
+	       "Options to query the font instance",
+	       this,
+	       true);
+
+    GOptionEntry entries[] =
+    {
+      {"quiet",		'q', G_OPTION_FLAG_REVERSE, G_OPTION_ARG_NONE,	&this->verbose,	"Generate machine-readable output",	nullptr},
+      {G_OPTION_REMAINING,	0, G_OPTION_FLAG_IN_MAIN,
+				G_OPTION_ARG_CALLBACK,	(gpointer) &collect_rest,	nullptr,	"[FONT-FILE]"},
+      {nullptr}
+    };
+    add_main_group (entries, this);
+
+    option_parser_t::add_options ();
   }
 
+  static gboolean
+  collect_rest (const char *name G_GNUC_UNUSED,
+		const char *arg,
+		gpointer    data,
+		GError    **error)
+  {
+    info_t *thiz = (info_t *) data;
+
+    if (!thiz->font_file)
+    {
+      thiz->font_file = g_strdup (arg);
+      return true;
+    }
+
+    g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_FAILED,
+		 "Too many arguments on the command line");
+    return false;
+  }
+
+
   protected:
-  hb_blob_t *blob = nullptr;
-  hb_face_t *face = nullptr;
-  hb_font_t *font = nullptr;
 
   hb_bool_t verbose = true;
   hb_bool_t first_item = true;
@@ -199,13 +231,15 @@
       language = hb_language_from_string (language_str, -1);
   }
 
-  template <typename app_t>
-  void operator () (app_t *app)
+  int
+  operator () (int argc, char **argv)
   {
-    blob = hb_blob_reference (((font_options_t *) app)->blob);
-    face = hb_face_reference (((font_options_t *) app)->face);
-    font = hb_font_reference (((font_options_t *) app)->font);
-    verbose = !app->quiet;
+    add_options ();
+
+    if (argc == 2)
+      show_all = true;
+
+    parse (&argc, &argv);
 
     if (all)
     {
@@ -287,9 +321,7 @@
 #endif
     if (list_palettes)	  _list_palettes ();
 
-    hb_font_destroy (font);
-    hb_face_destroy (face);
-    hb_blob_destroy (blob);
+    return 0;
   }
 
   protected:
@@ -1260,53 +1292,10 @@
 
     return 0;
   }
-
-  protected:
-
-  void add_options ()
-  {
-    font_options_type::add_options (this);
-    consumer_t::add_options (this);
-
-    GOptionEntry entries[] =
-    {
-      {"quiet",		'q', 0, G_OPTION_ARG_NONE,	&this->quiet,			"Generate machine-readable output",	nullptr},
-      {G_OPTION_REMAINING,	0, G_OPTION_FLAG_IN_MAIN,
-				G_OPTION_ARG_CALLBACK,	(gpointer) &collect_rest,	nullptr,	"[FONT-FILE]"},
-      {nullptr}
-    };
-    add_main_group (entries, this);
-    option_parser_t::add_options ();
-  }
-
-  private:
-
-  static gboolean
-  collect_rest (const char *name G_GNUC_UNUSED,
-		const char *arg,
-		gpointer    data,
-		GError    **error)
-  {
-    main_font_t *thiz = (main_font_t *) data;
-
-    if (!thiz->font_file)
-    {
-      thiz->font_file = g_strdup (arg);
-      return true;
-    }
-
-    g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_FAILED,
-		 "Too many arguments on the command line");
-    return false;
-  }
-
-  public:
-  hb_bool_t quiet = false;
 };
 
 int
 main (int argc, char **argv)
 {
-  using main_t = main_font_t<info_t, font_options_t>;
-  return batch_main<main_t> (argc, argv);
+  return batch_main<info_t> (argc, argv);
 }