[gegl] operation: massive refactoring of how operation meta data is handled



commit 1b7ea4207c78d46d87598a0765f093412e1694fe
Author: Ãyvind KolÃs <pippin gimp org>
Date:   Thu Mar 29 17:56:47 2012 +0100

    operation: massive refactoring of how operation meta data is handled
    
    Operations can now hold arbitrary string based key/value pairs, this
    permits dynamically extending what is stored without needing to break
    API/ABI, it also means we can encode things like gimp menu paths or
    similar.

 gegl/operation/gegl-operation.c               |  120 ++++++++++++++++++++++++-
 gegl/operation/gegl-operation.h               |   54 ++++++-----
 operations/affine/affine.c                    |    3 +-
 operations/affine/chant.h                     |    4 +-
 operations/common/bilateral-filter.c          |   12 ++-
 operations/common/box-blur.c                  |   10 +-
 operations/common/brightness-contrast.c       |   11 +--
 operations/common/buffer-sink.c               |    9 +-
 operations/common/buffer-source.c             |   10 +-
 operations/common/c2g.c                       |   14 ++--
 operations/common/checkerboard.c              |    8 +-
 operations/common/color-temperature.c         |   12 ++-
 operations/common/color-to-alpha.c            |    8 +-
 operations/common/color.c                     |   12 ++-
 operations/common/contrast-curve.c            |   10 ++-
 operations/common/difference-of-gaussians.c   |   10 ++-
 operations/common/display.c                   |   10 ++-
 operations/common/dropshadow.c                |   10 ++-
 operations/common/edge-laplace.c              |   10 ++-
 operations/common/edge-sobel.c                |   10 ++-
 operations/common/exp-combine.c               |   12 ++-
 operations/common/fattal02.c                  |   10 ++-
 operations/common/fractal-explorer.c          |    8 +-
 operations/common/gaussian-blur.c             |   10 ++-
 operations/common/gegl-buffer-load-op.c       |    8 +-
 operations/common/gegl-buffer-save-op.c       |    8 +-
 operations/common/grey.c                      |    8 +-
 operations/common/grid.c                      |    8 +-
 operations/common/introspect.c                |    8 +-
 operations/common/invert.c                    |   14 ++--
 operations/common/layer.c                     |    9 ++-
 operations/common/levels.c                    |    9 +-
 operations/common/load.c                      |   14 ++--
 operations/common/magick-load.c               |   10 ++-
 operations/common/mantiuk06.c                 |   10 ++-
 operations/common/map-absolute.c              |    9 +-
 operations/common/map-relative.c              |    9 +-
 operations/common/matting-global.c            |   15 ++--
 operations/common/mblur.c                     |    8 +-
 operations/common/mirrors.c                   |   10 ++-
 operations/common/mono-mixer.c                |    8 +-
 operations/common/motion-blur.c               |    8 +-
 operations/common/noise-reduction.c           |    8 +-
 operations/common/noise-spread.c              |    8 +-
 operations/common/noise.c                     |   12 ++-
 operations/common/opacity.c                   |   13 ++--
 operations/common/open-buffer.c               |    8 +-
 operations/common/over.c                      |   14 ++-
 operations/common/pixelise.c                  |   10 ++-
 operations/common/plasma.c                    |    8 +-
 operations/common/polar-coordinates.c         |    9 +-
 operations/common/posterize.c                 |   10 ++-
 operations/common/raw-load.c                  |   10 ++-
 operations/common/rectangle.c                 |   12 ++-
 operations/common/reinhard05.c                |   10 ++-
 operations/common/remap.c                     |   10 ++-
 operations/common/ripple.c                    |    8 +-
 operations/common/save.c                      |   10 ++-
 operations/common/snn-mean.c                  |   10 ++-
 operations/common/stress.c                    |   10 ++-
 operations/common/stretch-contrast.c          |   10 ++-
 operations/common/svg-huerotate.c             |    8 +-
 operations/common/svg-luminancetoalpha.c      |   10 ++-
 operations/common/svg-matrix.c                |    8 +-
 operations/common/svg-saturate.c              |    8 +-
 operations/common/threshold.c                 |   14 ++--
 operations/common/unsharp-mask.c              |   10 ++-
 operations/common/value-invert.c              |   11 ++-
 operations/common/vignette.c                  |    8 +-
 operations/common/waves.c                     |    8 +-
 operations/common/weighted-blend.c            |   10 ++-
 operations/common/whitebalance.c              |   11 ++-
 operations/common/write-buffer.c              |    8 +-
 operations/core/clone.c                       |   11 ++-
 operations/core/convert-format.c              |    9 +-
 operations/core/crop.c                        |    8 +-
 operations/core/nop.c                         |    8 +-
 operations/external/exr-load.cpp              |    8 +-
 operations/external/exr-save.cc               |    8 +-
 operations/external/ff-load.c                 |    8 +-
 operations/external/jp2-load.c                |    8 +-
 operations/external/jpg-load.c                |    8 +-
 operations/external/jpg-save.c                |   10 ++-
 operations/external/matting-levin.c           |   10 ++-
 operations/external/openraw.c                 |   10 ++-
 operations/external/path.c                    |    8 +-
 operations/external/pixbuf.c                  |   10 ++-
 operations/external/png-load.c                |    8 +-
 operations/external/png-save.c                |   10 ++-
 operations/external/ppm-load.c                |    8 +-
 operations/external/ppm-save.c                |   10 ++-
 operations/external/rgbe-load.c               |    8 +-
 operations/external/rgbe-save.c               |   10 ++-
 operations/external/save-pixbuf.c             |    8 +-
 operations/external/sdl-display.c             |   10 ++-
 operations/external/svg-load.c                |    8 +-
 operations/external/text.c                    |   11 ++-
 operations/external/vector-fill.c             |    8 +-
 operations/external/vector-stroke.c           |    8 +-
 operations/generated/add.c                    |   10 ++-
 operations/generated/clear.c                  |   12 ++-
 operations/generated/color-burn.c             |   10 ++-
 operations/generated/color-dodge.c            |   10 ++-
 operations/generated/darken.c                 |   11 ++-
 operations/generated/difference.c             |   11 ++-
 operations/generated/divide.c                 |   10 ++-
 operations/generated/dst-atop.c               |   12 ++-
 operations/generated/dst-in.c                 |   12 ++-
 operations/generated/dst-out.c                |   12 ++-
 operations/generated/dst-over.c               |   12 ++-
 operations/generated/dst.c                    |   12 ++-
 operations/generated/exclusion.c              |   11 ++-
 operations/generated/gamma.c                  |   10 ++-
 operations/generated/hard-light.c             |   10 ++-
 operations/generated/lighten.c                |   11 ++-
 operations/generated/math.rb                  |   10 ++-
 operations/generated/multiply.c               |   10 ++-
 operations/generated/other-blend.rb           |   12 ++-
 operations/generated/overlay.c                |   10 ++-
 operations/generated/plus.c                   |   11 ++-
 operations/generated/screen.c                 |   11 ++-
 operations/generated/soft-light.c             |   10 ++-
 operations/generated/src-atop.c               |   12 ++-
 operations/generated/src-in.c                 |   14 ++-
 operations/generated/src-out.c                |   12 ++-
 operations/generated/src-over.c               |   12 ++-
 operations/generated/src.c                    |   12 ++-
 operations/generated/subtract.c               |   10 ++-
 operations/generated/svg-12-blend.rb          |   36 +++++---
 operations/generated/svg-12-porter-duff.rb    |   23 +++--
 operations/generated/svg-multiply.c           |   10 ++-
 operations/generated/xor.c                    |   12 ++-
 operations/workshop/box-max.c                 |   10 ++-
 operations/workshop/box-min.c                 |   11 ++-
 operations/workshop/box-percentile.c          |   10 ++-
 operations/workshop/buffer-cache.c            |    8 +-
 operations/workshop/color-reduction.c         |   10 ++-
 operations/workshop/color-rotate.c            |    8 +-
 operations/workshop/convolution-matrix.c      |   10 ++-
 operations/workshop/cubism.c                  |    9 +-
 operations/workshop/deinterlace.c             |    8 +-
 operations/workshop/demosaic-bimedian.c       |   10 ++-
 operations/workshop/demosaic-simple.c         |   10 ++-
 operations/workshop/disc-percentile.c         |   10 ++-
 operations/workshop/ditto.c                   |    8 +-
 operations/workshop/emboss.c                  |    9 +-
 operations/workshop/external/ff-save.c        |    8 +-
 operations/workshop/external/gluas.c          |   10 ++-
 operations/workshop/external/lens-correct.c   |   10 ++-
 operations/workshop/external/line-profile.c   |   14 ++--
 operations/workshop/fractal-trace.c           |    8 +-
 operations/workshop/generated/average.c       |   10 ++-
 operations/workshop/generated/blend-reflect.c |   10 ++-
 operations/workshop/generated/blend.rb        |   10 ++-
 operations/workshop/generated/negation.c      |   10 ++-
 operations/workshop/generated/soft-burn.c     |   10 ++-
 operations/workshop/generated/soft-dodge.c    |   10 ++-
 operations/workshop/generated/subtractive.c   |   10 ++-
 operations/workshop/hstack.c                  |   10 ++-
 operations/workshop/kuwahara.c                |    8 +-
 operations/workshop/lens-distortion.c         |    9 +-
 operations/workshop/linear-gradient.c         |    8 +-
 operations/workshop/mandelbrot.c              |    8 +-
 operations/workshop/max-rgb.c                 |    8 +-
 operations/workshop/radial-gradient.c         |    8 +-
 operations/workshop/rawbayer-load.c           |   10 ++-
 operations/workshop/red-eye-removal.c         |    8 +-
 operations/workshop/snn-percentile.c          |   10 ++-
 operations/workshop/unpremul.c                |    8 +-
 operations/workshop/warp.c                    |    8 +-
 operations/workshop/whirl-pinch.c             |   10 ++-
 tools/operation_reference.c                   |   19 +++--
 172 files changed, 1190 insertions(+), 691 deletions(-)
---
diff --git a/gegl/operation/gegl-operation.c b/gegl/operation/gegl-operation.c
index 95f2e77..558c88d 100644
--- a/gegl/operation/gegl-operation.c
+++ b/gegl/operation/gegl-operation.c
@@ -48,6 +48,8 @@ G_DEFINE_TYPE (GeglOperation, gegl_operation, G_TYPE_OBJECT)
 static void
 gegl_operation_class_init (GeglOperationClass *klass)
 {
+  /* XXX: leaked for now, should replace G_DEFINE_TYPE with the expanded one */
+  klass->keys = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
   klass->name                      = NULL;  /* an operation class with
                                              * name == NULL is not
                                              * included when doing
@@ -55,8 +57,6 @@ gegl_operation_class_init (GeglOperationClass *klass)
                                              * name
                                              */
   klass->compat_name               = NULL;
-  klass->description               = NULL;
-  klass->categories                = NULL;
   klass->attach                    = attach;
   klass->prepare                   = NULL;
   klass->no_cache                  = FALSE;
@@ -458,3 +458,119 @@ gegl_operation_invalidate (GeglOperation       *operation,
 
   gegl_node_invalidated (node, roi, TRUE);
 }
+
+
+gchar **
+gegl_operation_list_keys (const gchar *operation_name,
+                          guint       *n_keys)
+{
+  GType         type;
+  GObjectClass *klass;
+  GList        *list, *l;
+  gchar       **ret;
+  int count;
+  int i;
+  type = gegl_operation_gtype_from_name (operation_name);
+  if (!type)
+    {
+      if (n_keys)
+        *n_keys = 0;
+      return NULL;
+    }
+  klass  = g_type_class_ref (type);
+  count = g_hash_table_size (GEGL_OPERATION_CLASS (klass)->keys);
+  ret = g_malloc0 (sizeof (gpointer) * (count + 1));
+  list = g_hash_table_get_keys (GEGL_OPERATION_CLASS (klass)->keys);
+  for (i = 0, l = list; l; l = l->next)
+    {
+      ret[i] = l->data;
+    }
+  g_list_free (list);
+  if (n_keys)
+    *n_keys = count;
+  g_type_class_unref (klass);
+  return ret;
+}
+
+void
+gegl_operation_class_set_key (GeglOperationClass *klass,
+                              const gchar        *key_name,
+                              const gchar        *key_value)
+{
+  if (!strcmp (key_name, "name"))
+    {
+      if (klass->name)
+        {
+          g_warning ("tried changing name of op %s to %s",
+                     klass->name, key_value);
+          return;
+        }
+      klass->name = g_strdup (key_value);
+    }
+  if (key_value)
+    g_hash_table_remove (klass->keys, key_name);
+  else
+    g_hash_table_insert (klass->keys, g_strdup (key_name),
+                         g_strdup (key_value));
+}
+
+void
+gegl_operation_class_set_keys (GeglOperationClass *klass,
+                               const gchar        *key_name,
+                                ...)
+{
+  va_list var_args;
+
+  va_start (var_args, key_name);
+  while (key_name)
+    {
+      const char *value = va_arg (var_args, char *);
+
+      gegl_operation_class_set_key (klass, key_name, value);
+
+      key_name = va_arg (var_args, char *);
+    }
+  va_end (var_args);
+}
+
+void
+gegl_operation_set_key (const gchar *operation_name,
+                        const gchar *key_name,
+                        const gchar *key_value)
+{
+  GType         type;
+  GObjectClass *klass;
+  type = gegl_operation_gtype_from_name (operation_name);
+  if (!type)
+    return;
+  klass  = g_type_class_ref (type);
+  gegl_operation_class_set_key (GEGL_OPERATION_CLASS (klass), key_name, key_value);
+  g_type_class_unref (klass);
+}
+
+const gchar *
+gegl_operation_class_get_key (GeglOperationClass *operation_class,
+                              const gchar        *key_name)
+{
+  const gchar  *ret = NULL;
+  ret = g_hash_table_lookup (GEGL_OPERATION_CLASS (operation_class)->keys, key_name);
+  return ret;
+}
+
+const gchar *
+gegl_operation_get_key (const gchar *operation_name,
+                        const gchar *key_name)
+{
+  GType         type;
+  GObjectClass *klass;
+  const gchar  *ret = NULL;
+  type = gegl_operation_gtype_from_name (operation_name);
+  if (!type)
+    {
+      return NULL;
+    }
+  klass  = g_type_class_ref (type);
+  ret = gegl_operation_class_get_key (GEGL_OPERATION_CLASS (klass), key_name);
+  g_type_class_unref (klass);
+  return ret;
+}
diff --git a/gegl/operation/gegl-operation.h b/gegl/operation/gegl-operation.h
index b8d5b06..7255e77 100644
--- a/gegl/operation/gegl-operation.h
+++ b/gegl/operation/gegl-operation.h
@@ -75,27 +75,11 @@ struct _GeglOperationClass
 {
   GObjectClass    parent_class;
 
-  const gchar    *name;        /* name(string) used to create/indetify
-                                    this type of operation in GEGL*/
+  const gchar    *name;        /* name(string) used to create/identify
+                                  this type of operation in GEGL*/
   const gchar    *compat_name; /* allows specifying an alias that the op is
                                   also known as */
-  const gchar    *categories;  /* a colon seperated list of categories */
-
-  const gchar    *description; /* textual description of the operation */
-  const gchar    *help;        /* documentation for the use of the op and it's properties
-                                  (individual properties are documented in-place with the
-                                   property)
-                                */
-
-  const gchar    *sample_graph;/* sample XML graph using a stock set of images
-                                  for inputs, providing a visual preview of how the op is
-                                  to be used.
-                                */
-
-  const gchar    *authors;     /* credits for having written the op */
-  const gchar    *license;     /* license of the op */
-
-
+  GHashTable     *keys;        /* hashtable used for storing meta-data about an op */
 
   guint           no_cache      :1;  /* do not create a cache for this operation */
   guint           opencl_support:1;
@@ -232,9 +216,31 @@ const gchar *   gegl_operation_get_name      (GeglOperation *operation);
 GeglNode      * gegl_operation_get_source_node (GeglOperation *operation,
                                                 const gchar   *pad_name);
 
-GParamSpec ** gegl_list_properties (const gchar *operation_type,
-                                    guint       *n_properties_p);
+/* XXX: should be changed to gegl_op_list_properties */
+GParamSpec ** gegl_list_properties             (const gchar *operation_type,
+                                                guint       *n_properties_p);
+
+/* API to change  */
+void          gegl_operation_class_set_key     (GeglOperationClass *klass,
+                                                const gchar *key_name,
+                                                const gchar *key_value);
+
+const gchar * gegl_operation_class_get_key     (GeglOperationClass *operation_class,
+                                                const gchar        *key_name);
+
+void          gegl_operation_class_set_keys    (GeglOperationClass *klass,
+                                                const gchar        *key_name,
+                                                ...);
+
+gchar      ** gegl_operation_list_keys         (const gchar *operation_type,
+                                                guint       *n_keys);
+
+void          gegl_operation_set_key           (const gchar *operation_type,
+                                                const gchar *key_name,
+                                                const gchar *key_value);
 
+const gchar * gegl_operation_get_key            (const gchar *operation_type,
+                                                 const gchar *key_name);
 
 /* invalidate a specific rectangle, indicating the any computation depending
  * on this roi is now invalid.
@@ -242,9 +248,9 @@ GParamSpec ** gegl_list_properties (const gchar *operation_type,
  * @roi : the region to blank or NULL for the nodes current have_rect
  * @clear_cache: whether any present caches should be zeroed out
  */
-void     gegl_operation_invalidate            (GeglOperation       *operation,
-                                               const GeglRectangle *roi,
-                                               gboolean             clear_cache);
+void     gegl_operation_invalidate       (GeglOperation       *operation,
+                                          const GeglRectangle *roi,
+                                          gboolean             clear_cache);
 
 /* internal utility functions used by gegl, these should not be used
  * externally */
diff --git a/operations/affine/affine.c b/operations/affine/affine.c
index 3862909..7ef7319 100644
--- a/operations/affine/affine.c
+++ b/operations/affine/affine.c
@@ -187,12 +187,13 @@ op_affine_class_init (OpAffineClass *klass)
   op_class->get_required_for_output   = gegl_affine_get_required_for_output;
   op_class->detect                    = gegl_affine_detect;
   op_class->process                   = gegl_affine_process;
-  op_class->categories                = "transform";
   op_class->prepare                   = gegl_affine_prepare;
   op_class->no_cache                  = TRUE;
 
   klass->create_matrix = NULL;
 
+  gegl_operation_class_set_key (op_class, "categories", "transform");
+
   g_object_class_install_property (gobject_class, PROP_ORIGIN_X,
                                    g_param_spec_double (
                                      "origin-x",
diff --git a/operations/affine/chant.h b/operations/affine/chant.h
index e2357b2..a549bce 100644
--- a/operations/affine/chant.h
+++ b/operations/affine/chant.h
@@ -276,13 +276,15 @@ gegl_chant_class_init (ChantClass * klass)
   class_init (operation_class);
 #endif
 
+#if 1
 #define M_GEGL_CHANT_SET_NAME_EXTENDED(nam) \
   operation_class->name=g_strdup("gegl:"#nam);
 #define M_GEGL_CHANT_SET_NAME(name)   M_GEGL_CHANT_SET_NAME_EXTENDED(name)
   M_GEGL_CHANT_SET_NAME (GEGL_CHANT_NAME);
+#endif
 
 #ifdef GEGL_CHANT_DESCRIPTION
-  operation_class->description = GEGL_CHANT_DESCRIPTION;
+  gegl_operation_class_set_key (operation_class, "description", GEGL_CHANT_DESCRIPTION);
 #endif
 
 #define gegl_chant_int(name, min, max, def, blurb)  \
diff --git a/operations/common/bilateral-filter.c b/operations/common/bilateral-filter.c
index c72ac20..0bce6b1 100644
--- a/operations/common/bilateral-filter.c
+++ b/operations/common/bilateral-filter.c
@@ -178,12 +178,14 @@ gegl_chant_class_init (GeglChantClass *klass)
   filter_class->process   = process;
   operation_class->prepare = prepare;
 
-  operation_class->name        = "gegl:bilateral-filter";
-  operation_class->categories  = "misc";
-  operation_class->description =
-        _("An edge preserving blur filter that can be used for noise reduction. "
+  gegl_operation_class_set_keys (operation_class,
+           "name", "gegl:bilateral-filter",
+           "categories", "misc",
+           "description",
+           _("An edge preserving blur filter that can be used for noise reduction. "
           "It is a gaussian blur where the contribution of neighbourhood pixels "
-          "are weighted by the color difference from the center pixel.");
+          "are weighted by the color difference from the center pixel."),
+           NULL);
 }
 
 #endif
diff --git a/operations/common/box-blur.c b/operations/common/box-blur.c
index 7b3cb0e..a59163e 100644
--- a/operations/common/box-blur.c
+++ b/operations/common/box-blur.c
@@ -407,11 +407,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   filter_class->process    = process;
   operation_class->prepare = prepare;
 
-  operation_class->categories  = "blur";
-  operation_class->name        = "gegl:box-blur";
-  operation_class->opencl_support = TRUE;
-  operation_class->description =
-       _("Performs an averaging of a square box of pixels.");
+  gegl_operation_class_set_keys (operation_class,
+      "name",        "gegl:box-blur",
+      "categories",  "blur",
+      "description", _("Performs an averaging of a square box of pixels."),
+      NULL);
 }
 
 #endif
diff --git a/operations/common/brightness-contrast.c b/operations/common/brightness-contrast.c
index c3ca018..a7592ef 100644
--- a/operations/common/brightness-contrast.c
+++ b/operations/common/brightness-contrast.c
@@ -190,14 +190,13 @@ gegl_chant_class_init (GeglChantClass *klass)
   /* specify the name this operation is found under in the GUI/when
    * programming/in XML
    */
-  operation_class->name        = "gegl:brightness-contrast";
   operation_class->opencl_support = TRUE;
 
-  /* a colon separated list of categories/tags for this operations */
-  operation_class->categories  = "color";
-
-  /* a description of what this operations does */
-  operation_class->description = _("Changes the light level and contrast.");
+  gegl_operation_class_set_keys (operation_class,
+      "name",       "gegl:brightness-contrast",
+      "categories", "color", 
+      "description", _("Changes the light level and contrast."),
+      NULL);
 }
 
 #endif /* closing #ifdef GEGL_CHANT_PROPERTIES ... else ... */
diff --git a/operations/common/buffer-sink.c b/operations/common/buffer-sink.c
index 841230e..09e1a47 100644
--- a/operations/common/buffer-sink.c
+++ b/operations/common/buffer-sink.c
@@ -77,10 +77,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   sink_class->process = process;
   sink_class->needs_full = TRUE;
 
-  operation_class->name        = "gegl:buffer-sink";
-  operation_class->compat_name = "gegl:save-buffer";
-  operation_class->categories  = "programming:output";
-  operation_class->description = _("A GEGL buffer destination surface.");
+  gegl_operation_class_set_keys (operation_class,
+      "name",       "gegl:buffer-sink",
+      "categories", "programming:output",
+      "description", _("A GEGL buffer destination surface."),
+      NULL);
 }
 
 #endif
diff --git a/operations/common/buffer-source.c b/operations/common/buffer-source.c
index c6d9304..a2d2d21 100644
--- a/operations/common/buffer-source.c
+++ b/operations/common/buffer-source.c
@@ -110,11 +110,11 @@ gegl_chant_class_init (GeglChantClass *klass)
 
   G_OBJECT_CLASS (klass)->dispose = dispose;
 
-  operation_class->name        = "gegl:buffer-source";
-  operation_class->compat_name = "gegl:load-buffer";
-  operation_class->categories  = "programming:input";
-  operation_class->description =
-        _("A source that uses an in-memory GeglBuffer, for use internally by GEGL.");
+  gegl_operation_class_set_keys (operation_class,
+      "name",       "gegl:buffer-source",
+      "categories", "programming:input",
+      "description", _("A source that uses an in-memory GeglBuffer, for use internally by GEGL."),
+      NULL);
 
   operation_class->no_cache = TRUE;
 }
diff --git a/operations/common/c2g.c b/operations/common/c2g.c
index 8a371a8..be7fb80 100644
--- a/operations/common/c2g.c
+++ b/operations/common/c2g.c
@@ -186,12 +186,14 @@ gegl_chant_class_init (GeglChantClass *klass)
    */
   operation_class->get_bounding_box = get_bounding_box;
 
-  operation_class->name        = "gegl:c2g";
-  operation_class->categories  = "enhance";
-  operation_class->description =
-        _("Color to grayscale conversion, uses envelopes formed from spatial "
-         " color differences to perform color-feature preserving grayscale "
-         " spatial contrast enhancement.");
+  gegl_operation_class_set_keys (operation_class,
+      "name",        "gegl:c2g",
+      "categories",  "enhance",
+      "description", 
+     _("Color to grayscale conversion, uses envelopes formed from spatial "
+       " color differences to perform color-feature preserving grayscale "
+       " spatial contrast enhancement."),
+     NULL);
 }
 
 #endif
diff --git a/operations/common/checkerboard.c b/operations/common/checkerboard.c
index 9394b07..5a37304 100644
--- a/operations/common/checkerboard.c
+++ b/operations/common/checkerboard.c
@@ -140,9 +140,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->get_bounding_box = get_bounding_box;
   operation_class->prepare = prepare;
 
-  operation_class->name        = "gegl:checkerboard";
-  operation_class->categories  = "render";
-  operation_class->description = _("Checkerboard renderer");
+  gegl_operation_class_set_keys (operation_class,
+    "name",  "gegl:checkerboard",
+    "categories", "render",
+    "description", _("Checkerboard renderer"),
+    NULL);
 }
 
 #endif
diff --git a/operations/common/color-temperature.c b/operations/common/color-temperature.c
index fe9a88a..fb1b523 100644
--- a/operations/common/color-temperature.c
+++ b/operations/common/color-temperature.c
@@ -254,15 +254,17 @@ gegl_chant_class_init (GeglChantClass *klass)
   object_class->notify   = notify;
 
   operation_class->prepare = prepare;
+  operation_class->opencl_support = TRUE;
 
   point_filter_class->process = process;
   point_filter_class->cl_process = cl_process;
 
-  operation_class->name        = "gegl:color-temperature";
-  operation_class->opencl_support = TRUE;
-  operation_class->categories  = "color";
-  operation_class->description =
-        _("Allows changing the color temperature of an image.");
+  gegl_operation_class_set_keys (operation_class,
+    "name"       , "gegl:color-temperature",
+    "categories" , "color",
+    "description",
+          _("Allows changing the color temperature of an image."),
+    NULL);
 }
 
 /* Coefficients of rational functions of degree 5 fitted per color channel to
diff --git a/operations/common/color-to-alpha.c b/operations/common/color-to-alpha.c
index 665505b..7daaf6b 100644
--- a/operations/common/color-to-alpha.c
+++ b/operations/common/color-to-alpha.c
@@ -164,9 +164,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   filter_class->process    = process;
   operation_class->prepare = prepare;
 
-  operation_class->categories  = "color";
-  operation_class->name        = "gegl:color-to-alpha";
-  operation_class->description = _("Performs color-to-alpha on the image.");
+  gegl_operation_class_set_keys (operation_class,
+    "name"       , "gegl:color-to-alpha",
+    "categories" , "color",
+    "description", _("Performs color-to-alpha on the image."),
+    NULL);
 }
 
 #endif
diff --git a/operations/common/color.c b/operations/common/color.c
index 0517d20..61fd7f4 100644
--- a/operations/common/color.c
+++ b/operations/common/color.c
@@ -81,11 +81,13 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->get_bounding_box = gegl_color_op_get_bounding_box;
   operation_class->prepare          = gegl_color_op_prepare;
 
-  operation_class->name        = "gegl:color";
-  operation_class->categories  = "render";
-  operation_class->description =
-        _("Generates a buffer entirely filled with the specified color, "
-          "crop it to get smaller dimensions.");
+  gegl_operation_class_set_keys (operation_class,
+    "name"       , "gegl:color",
+    "categories" , "render",
+    "description",
+      _("Generates a buffer entirely filled with the specified color, "
+        "crop it to get smaller dimensions."),
+    NULL);
 }
 
 #endif
diff --git a/operations/common/contrast-curve.c b/operations/common/contrast-curve.c
index 5daaca9..9fbb2b9 100644
--- a/operations/common/contrast-curve.c
+++ b/operations/common/contrast-curve.c
@@ -118,10 +118,12 @@ gegl_chant_class_init (GeglChantClass *klass)
   point_filter_class->process = process;
   operation_class->prepare = prepare;
 
-  operation_class->name        = "gegl:contrast-curve";
-  operation_class->categories  = "color";
-  operation_class->description =
-        _("Adjusts the contrast of the image according to a curve.");
+  gegl_operation_class_set_keys (operation_class,
+    "name"       , "gegl:contrast-curve",
+    "categories" , "color",
+    "description",
+        _("Adjusts the contrast of the image according to a curve."),
+        NULL);
 }
 
 #endif
diff --git a/operations/common/difference-of-gaussians.c b/operations/common/difference-of-gaussians.c
index abf38d9..86dc24b 100644
--- a/operations/common/difference-of-gaussians.c
+++ b/operations/common/difference-of-gaussians.c
@@ -92,10 +92,12 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class = GEGL_OPERATION_CLASS (klass);
   operation_class->attach = attach;
 
-  operation_class->name        = "gegl:difference-of-gaussians";
-  operation_class->categories  = "meta:edge";
-  operation_class->description =
-        _("Does an edge detection based on the difference of two gaussian blurs.");
+  gegl_operation_class_set_keys (operation_class,
+    "name"       , "gegl:difference-of-gaussians",
+    "categories" , "meta:edge",
+    "description",
+        _("Does an edge detection based on the difference of two gaussian blurs."),
+        NULL);
 }
 
 #endif
diff --git a/operations/common/display.c b/operations/common/display.c
index 247b371..706fd6f 100644
--- a/operations/common/display.c
+++ b/operations/common/display.c
@@ -135,9 +135,11 @@ gegl_chant_class_init (GeglChantClass *klass)
 
   sink_class->needs_full = TRUE;
 
-  operation_class->name        = "gegl:display";
-  operation_class->categories  = "meta:display";
-  operation_class->description =
-        _("Display the input buffer in a window.");
+  gegl_operation_class_set_keys (operation_class,
+    "name"        , "gegl:display",
+    "categories"  , "meta:display",
+    "description" ,
+          _("Display the input buffer in a window."),
+    NULL);
 }
 #endif
diff --git a/operations/common/dropshadow.c b/operations/common/dropshadow.c
index f62d4b8..8798350 100644
--- a/operations/common/dropshadow.c
+++ b/operations/common/dropshadow.c
@@ -75,10 +75,12 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class = GEGL_OPERATION_CLASS (klass);
   operation_class->attach = attach;
 
-  operation_class->name        = "gegl:dropshadow";
-  operation_class->categories  = "meta:effects";
-  operation_class->description =
-        _("Creates a dropshadow effect on the input buffer.");
+  gegl_operation_class_set_keys (operation_class,
+    "name"       , "gegl:dropshadow",
+    "categories" , "meta:effects",
+    "description",
+    _("Creates a dropshadow effect on the input buffer."),
+    NULL);
 }
 
 #endif
diff --git a/operations/common/edge-laplace.c b/operations/common/edge-laplace.c
index a25ab88..f836b64 100644
--- a/operations/common/edge-laplace.c
+++ b/operations/common/edge-laplace.c
@@ -238,10 +238,12 @@ gegl_chant_class_init (GeglChantClass *klass)
   filter_class->process   = process;
   operation_class->prepare = prepare;
 
-  operation_class->name        = "gegl:edge-laplace";
-  operation_class->categories  = "edge-detect";
-  operation_class->description =
-        _("High-resolution edge detection");
+  gegl_operation_class_set_keys (operation_class,
+    "name"        , "gegl:edge-laplace",
+    "categories"  , "edge-detect",
+    "description" ,
+          _("High-resolution edge detection"),
+    NULL);
 }
 
 #endif
diff --git a/operations/common/edge-sobel.c b/operations/common/edge-sobel.c
index f93905a..2f3eba8 100644
--- a/operations/common/edge-sobel.c
+++ b/operations/common/edge-sobel.c
@@ -196,10 +196,12 @@ gegl_chant_class_init (GeglChantClass *klass)
   filter_class->process   = process;
   operation_class->prepare = prepare;
 
-  operation_class->name        = "gegl:edge-sobel";
-  operation_class->categories  = "edge-detect";
-  operation_class->description =
-        _("Specialized direction-dependent edge detection");
+  gegl_operation_class_set_keys (operation_class,
+    "name"       , "gegl:edge-sobel",
+    "categories" , "edge-detect",
+    "description",
+          _("Specialized direction-dependent edge detection"),
+          NULL);
 }
 
 #endif
diff --git a/operations/common/exp-combine.c b/operations/common/exp-combine.c
index bc66d03..3e603a6 100644
--- a/operations/common/exp-combine.c
+++ b/operations/common/exp-combine.c
@@ -1283,13 +1283,15 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->get_bounding_box  = gegl_expcombine_get_bounding_box;
   operation_class->get_cached_region = gegl_expcombine_get_cached_region;
 
+  operation_class->prepare     = gegl_expcombine_prepare;
   operation_class->get_required_for_output = gegl_expcombine_get_required_for_output;
 
-  operation_class->name        = "gegl:exp-combine";
-  operation_class->categories  = "compositors";
-  operation_class->description =
-      _("Combine multiple scene exposures into one high range buffer");
-  operation_class->prepare     = gegl_expcombine_prepare;
+  gegl_operation_class_set_keys (operation_class,
+  "name"       , "gegl:exp-combine",
+  "categories" , "compositors",
+  "description",
+      _("Combine multiple scene exposures into one high range buffer"),
+      NULL);
 }
 
 
diff --git a/operations/common/fattal02.c b/operations/common/fattal02.c
index f7f4667..a45fe34 100644
--- a/operations/common/fattal02.c
+++ b/operations/common/fattal02.c
@@ -1318,13 +1318,15 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->get_required_for_output = fattal02_get_required_for_output;
   operation_class->get_cached_region       = fattal02_get_cached_region;
 
-  operation_class->name        = "gegl:fattal02";
-  operation_class->categories  = "tonemapping";
-  operation_class->description =
+  gegl_operation_class_set_keys (operation_class,
+  "name"       , "gegl:fattal02",
+  "categories" , "tonemapping",
+  "description",
         _("Adapt an image, which may have a high dynamic range, for "
 	  "presentation using a low dynamic range. This operator attenuates "
           "the magnitudes of local image gradients, producing luminance "
-          "within the range 0.0-1.0");
+          "within the range 0.0-1.0"),
+        NULL);
 }
 
 #endif
diff --git a/operations/common/fractal-explorer.c b/operations/common/fractal-explorer.c
index 6cf05cd..e30a7e2 100644
--- a/operations/common/fractal-explorer.c
+++ b/operations/common/fractal-explorer.c
@@ -466,9 +466,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->get_bounding_box = get_bounding_box;
   operation_class->prepare = prepare;
 
-  operation_class->name        = "gegl:fractal-explorer";
-  operation_class->categories  = "render";
-  operation_class->description = _("Fractal Explorer");
+  gegl_operation_class_set_keys (operation_class,
+    "name"       , "gegl:fractal-explorer",
+    "categories" , "render",
+    "description", _("Fractal Explorer"),
+    NULL);
 
   operation_class->no_cache = TRUE;
   operation_class->get_cached_region = NULL;
diff --git a/operations/common/gaussian-blur.c b/operations/common/gaussian-blur.c
index 11f13f1..f46b4b2 100644
--- a/operations/common/gaussian-blur.c
+++ b/operations/common/gaussian-blur.c
@@ -489,11 +489,13 @@ gegl_chant_class_init (GeglChantClass *klass)
   filter_class->process    = process;
   operation_class->prepare = prepare;
 
-  operation_class->categories  = "blur";
-  operation_class->name        = "gegl:gaussian-blur";
-  operation_class->description =
+  gegl_operation_class_set_keys (operation_class,
+    "name",       "gegl:gaussian-blur",
+    "categories", "blur",
+    "description",
         _("Performs an averaging of neighbouring pixels with the "
-          "normal distribution as weighting.");
+          "normal distribution as weighting."),
+        NULL);
 }
 
 #endif
diff --git a/operations/common/gegl-buffer-load-op.c b/operations/common/gegl-buffer-load-op.c
index 7454908..f5693d3 100644
--- a/operations/common/gegl-buffer-load-op.c
+++ b/operations/common/gegl-buffer-load-op.c
@@ -82,9 +82,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->process          = gegl_buffer_load_op_process;
   operation_class->get_bounding_box = gegl_buffer_load_op_get_bounding_box;
 
-  operation_class->name        = "gegl:gegl-buffer-load";
-  operation_class->categories  = "hidden";
-  operation_class->description = _("GeglBuffer file loader.");
+  gegl_operation_class_set_keys (operation_class,
+    "name"       , "gegl:gegl-buffer-load",
+    "categories" , "hidden",
+    "description", _("GeglBuffer file loader."),
+    NULL);
 
   gegl_extension_handler_register (".gegl", "gegl:gegl-buffer-load");
 }
diff --git a/operations/common/gegl-buffer-save-op.c b/operations/common/gegl-buffer-save-op.c
index bc7240a..8a2eb70 100644
--- a/operations/common/gegl-buffer-save-op.c
+++ b/operations/common/gegl-buffer-save-op.c
@@ -56,9 +56,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   sink_class->process    = gegl_buffer_save_op_process;
   sink_class->needs_full = TRUE;
 
-  operation_class->name        = "gegl:gegl-buffer-save";
-  operation_class->categories  = "hidden";
-  operation_class->description = _("GeglBuffer file writer.");
+  gegl_operation_class_set_keys (operation_class,
+    "name"       , "gegl:gegl-buffer-save",
+    "categories" , "hidden",
+    "description", _("GeglBuffer file writer."),
+    NULL);
 
   gegl_extension_handler_register_saver (".gegl", "gegl:gegl-buffer-save");
 }
diff --git a/operations/common/grey.c b/operations/common/grey.c
index 753ccf2..8e48373 100644
--- a/operations/common/grey.c
+++ b/operations/common/grey.c
@@ -73,9 +73,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   point_filter_class->process = process;
   operation_class->prepare = prepare;
 
-  operation_class->name        = "gegl:grey";
-  operation_class->categories  = "color";
-  operation_class->description = _("Turns the image greyscale");
+  gegl_operation_class_set_keys (operation_class,
+      "name"       , "gegl:grey",
+      "categories" , "color",
+      "description", _("Turns the image greyscale"),
+      NULL);
 }
 
 #endif
diff --git a/operations/common/grid.c b/operations/common/grid.c
index efa177b..3811f0a 100644
--- a/operations/common/grid.c
+++ b/operations/common/grid.c
@@ -123,9 +123,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->get_bounding_box = get_bounding_box;
   operation_class->prepare = prepare;
 
-  operation_class->name        = "gegl:grid";
-  operation_class->categories  = "render";
-  operation_class->description = _("Grid renderer");
+  gegl_operation_class_set_keys (operation_class,
+    "name"       , "gegl:grid",
+    "categories" , "render",
+    "description", _("Grid renderer"),
+    NULL);
 }
 
 #endif
diff --git a/operations/common/introspect.c b/operations/common/introspect.c
index 6a75369..ea65684 100644
--- a/operations/common/introspect.c
+++ b/operations/common/introspect.c
@@ -154,9 +154,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->process          = gegl_introspect_process;
   operation_class->get_bounding_box = gegl_introspect_get_bounding_box;
 
-  operation_class->name        = "gegl:introspect";
-  operation_class->categories  = "render";
-  operation_class->description = _("GEGL graph visualizer.");
+  gegl_operation_class_set_keys (operation_class,
+    "name"       , "gegl:introspect",
+    "categories" , "render",
+    "description", _("GEGL graph visualizer."),
+    NULL);
 }
 
 #endif
diff --git a/operations/common/invert.c b/operations/common/invert.c
index f300b85..9a3e4d4 100644
--- a/operations/common/invert.c
+++ b/operations/common/invert.c
@@ -121,13 +121,15 @@ gegl_chant_class_init (GeglChantClass *klass)
 
   point_filter_class->process = process;
   point_filter_class->cl_process = cl_process;
-
-  operation_class->name        = "gegl:invert";
   operation_class->opencl_support = TRUE;
-  operation_class->categories  = "color";
-  operation_class->description =
-     _("Inverts the components (except alpha), the result is the "
-       "corresponding \"negative\" image.");
+
+  gegl_operation_class_set_keys (operation_class,
+    "name"       , "gegl:invert",
+    "categories" , "color",
+    "description",
+       _("Inverts the components (except alpha), the result is the "
+         "corresponding \"negative\" image."),
+       NULL);
 }
 
 #endif
diff --git a/operations/common/layer.c b/operations/common/layer.c
index 68c2ea3..4375518 100644
--- a/operations/common/layer.c
+++ b/operations/common/layer.c
@@ -258,11 +258,14 @@ gegl_chant_class_init (GeglChantClass *klass)
 
   object_class->finalize = finalize;
 
-  operation_class->name        = "gegl:layer";
-  operation_class->categories  = "meta";
-  operation_class->description = _("A layer in the traditional sense.");
   operation_class->attach = attach;
   operation_class->prepare = prepare;
+
+  gegl_operation_class_set_keys (operation_class,
+    "name"       , "gegl:layer",
+    "categories" , "meta",
+    "description", _("A layer in the traditional sense."),
+    NULL);
 }
 
 
diff --git a/operations/common/levels.c b/operations/common/levels.c
index 0410dc4..33778c9 100644
--- a/operations/common/levels.c
+++ b/operations/common/levels.c
@@ -97,10 +97,11 @@ gegl_chant_class_init (GeglChantClass *klass)
 
   point_filter_class->process = process;
 
-  operation_class->name        = "gegl:levels";
-  operation_class->categories  = "color";
-  operation_class->description =
-        _("Remaps the intensity range of the image");
+  gegl_operation_class_set_keys (operation_class,
+    "name"       , "gegl:levels",
+    "categories" , "color",
+    "description", _("Remaps the intensity range of the image"),
+    NULL);
 }
 
 #endif
diff --git a/operations/common/load.c b/operations/common/load.c
index 58f2d34..022c67d 100644
--- a/operations/common/load.c
+++ b/operations/common/load.c
@@ -171,14 +171,16 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->attach = attach;
   operation_class->detect = detect;
   operation_class->prepare = prepare;
+  operation_class->no_cache = TRUE;
 
-  operation_class->name        = "gegl:load";
-  operation_class->categories  = "meta:input";
-  operation_class->description =
-        _("Multipurpose file loader, that uses other native handlers, and "
-          "fallback conversion using image magick's convert.");
+  gegl_operation_class_set_keys (operation_class,
+    "name"       , "gegl:load",
+    "categories" , "meta:input",
+    "description",
+          _("Multipurpose file loader, that uses other native handlers, and "
+            "fallback conversion using image magick's convert."),
+    NULL);
 
-  operation_class->no_cache = TRUE;
 }
 
 #endif
diff --git a/operations/common/magick-load.c b/operations/common/magick-load.c
index 6055410..9664225 100644
--- a/operations/common/magick-load.c
+++ b/operations/common/magick-load.c
@@ -129,10 +129,12 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->get_cached_region = get_cached_region;;
   operation_class->no_cache = FALSE;
 
-  operation_class->name        = "gegl:magick-load";
-  operation_class->categories  = "hidden";
-  operation_class->description =
-        _("Image Magick wrapper using the png op.");
+  gegl_operation_class_set_keys (operation_class,
+        "name"       , "gegl:magick-load",
+        "categories" , "hidden",
+        "description",
+        _("Image Magick wrapper using the png op."),
+        NULL);
 }
 
 #endif
diff --git a/operations/common/mantiuk06.c b/operations/common/mantiuk06.c
index 80eda07..02dfd29 100644
--- a/operations/common/mantiuk06.c
+++ b/operations/common/mantiuk06.c
@@ -1632,13 +1632,15 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->get_required_for_output = mantiuk06_get_required_for_output;
   operation_class->get_cached_region       = mantiuk06_get_cached_region;
 
-  operation_class->name        = "gegl:mantiuk06";
-  operation_class->categories  = "tonemapping";
-  operation_class->description =
+  gegl_operation_class_set_keys (operation_class,
+      "name"       , "gegl:mantiuk06",
+      "categories" , "tonemapping",
+      "description",
         _("Adapt an image, which may have a high dynamic range, for "
           "presentation using a low dynamic range. This operator constrains "
           "contrasts across multiple spatial frequencies, producing "
-          "luminance within the range 0.0-1.0");
+          "luminance within the range 0.0-1.0"),
+        NULL);
 }
 
 #endif
diff --git a/operations/common/map-absolute.c b/operations/common/map-absolute.c
index 68cac1a..6d90c6a 100644
--- a/operations/common/map-absolute.c
+++ b/operations/common/map-absolute.c
@@ -142,9 +142,10 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->prepare = prepare;
   operation_class->get_required_for_output = get_required_for_output;
 
-  operation_class->name        = "gegl:map-absolute";
-
-  operation_class->categories  = "transform";
-  operation_class->description = _("sample input with an auxiliary buffer that contain absolute source coordinates");
+  gegl_operation_class_set_keys (operation_class,
+    "name"       , "gegl:map-absolute",
+    "categories" , "transform",
+    "description", _("sample input with an auxiliary buffer that contain absolute source coordinates"),
+    NULL);
 }
 #endif
diff --git a/operations/common/map-relative.c b/operations/common/map-relative.c
index 0fadda1..3a4eb24 100644
--- a/operations/common/map-relative.c
+++ b/operations/common/map-relative.c
@@ -150,9 +150,10 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->prepare = prepare;
   operation_class->get_required_for_output = get_required_for_output;
 
-  operation_class->name        = "gegl:map-relative";
-
-  operation_class->categories  = "transform";
-  operation_class->description = _("sample input with an auxiliary buffer that contain relative source coordinates");
+  gegl_operation_class_set_keys (operation_class,
+    "name"       , "gegl:map-relative",
+    "categories" , "transform",
+    "description", _("sample input with an auxiliary buffer that contain relative source coordinates"),
+    NULL);
 }
 #endif
diff --git a/operations/common/matting-global.c b/operations/common/matting-global.c
index 1e503bc..94ec815 100644
--- a/operations/common/matting-global.c
+++ b/operations/common/matting-global.c
@@ -546,11 +546,14 @@ static void gegl_chant_class_init (GeglChantClass *klass) {
   operation_class->prepare                 = matting_prepare;
   operation_class->get_required_for_output = matting_get_required_for_output;
   operation_class->get_cached_region       = matting_get_cached_region;
-  operation_class->name        = "gegl:matting-global";
-  operation_class->categories  = "misc";
-  operation_class->description =
-    _("Given a sparse user supplied tri-map and an input image, create a "
-      "foreground alpha mat. Set white as selected, black as unselected, "
-      "for the tri-map.");
+
+  gegl_operation_class_set_keys (operation_class,
+    "name"       , "gegl:matting-global",
+    "categories" , "misc",
+    "description",
+      _("Given a sparse user supplied tri-map and an input image, create a "
+        "foreground alpha mat. Set white as selected, black as unselected, "
+        "for the tri-map."),
+    NULL);
 }
 #endif
diff --git a/operations/common/mblur.c b/operations/common/mblur.c
index a238bef..2ac4b5c 100644
--- a/operations/common/mblur.c
+++ b/operations/common/mblur.c
@@ -138,9 +138,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   filter_class->process = process;
   operation_class->prepare = prepare;
 
-  operation_class->name        = "gegl:mblur";
-  operation_class->categories  = "blur:video";
-  operation_class->description = _("Accumulating motion blur");
+  gegl_operation_class_set_keys (operation_class,
+    "name"       , "gegl:mblur",
+    "categories" , "blur:video",
+    "description", _("Accumulating motion blur"),
+    NULL);
 }
 
 #endif
diff --git a/operations/common/mirrors.c b/operations/common/mirrors.c
index 98cf6ef..178de2f 100644
--- a/operations/common/mirrors.c
+++ b/operations/common/mirrors.c
@@ -394,10 +394,12 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->get_bounding_box = get_bounding_box;
   operation_class->get_required_for_output = get_required_for_output;
 
-  operation_class->name        = "gegl:mirrors";
-  operation_class->categories  = "blur";
-  operation_class->description =
-        _("Applies mirroring effect on the image.");
+  gegl_operation_class_set_keys (operation_class,
+    "name"       , "gegl:mirrors",
+    "categories" , "blur",
+    "description",
+          _("Applies mirroring effect on the image."),
+    NULL);
 }
 
 #endif
diff --git a/operations/common/mono-mixer.c b/operations/common/mono-mixer.c
index 0020ef3..eb3b807 100644
--- a/operations/common/mono-mixer.c
+++ b/operations/common/mono-mixer.c
@@ -99,9 +99,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   filter_class->process = process;
   operation_class->prepare = prepare;
 
-  operation_class->name        = "gegl:mono-mixer";
-  operation_class->categories  = "color";
-  operation_class->description = _("Monochrome channel mixer");
+  gegl_operation_class_set_keys (operation_class,
+    "name"       , "gegl:mono-mixer",
+    "categories" , "color",
+    "description", _("Monochrome channel mixer"),
+    NULL);
 }
 
 #endif
diff --git a/operations/common/motion-blur.c b/operations/common/motion-blur.c
index 945fbb4..fe58aaa 100644
--- a/operations/common/motion-blur.c
+++ b/operations/common/motion-blur.c
@@ -168,9 +168,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   filter_class->process = process;
   operation_class->prepare = prepare;
 
-  operation_class->name        = "gegl:motion-blur";
-  operation_class->categories  = "blur";
-  operation_class->description = _("Linear motion blur");
+  gegl_operation_class_set_keys (operation_class,
+    "name"       , "gegl:motion-blur",
+    "categories" , "blur",
+    "description", _("Linear motion blur"),
+    NULL);
 }
 
 #endif
diff --git a/operations/common/noise-reduction.c b/operations/common/noise-reduction.c
index 8aa8605..66f209d 100644
--- a/operations/common/noise-reduction.c
+++ b/operations/common/noise-reduction.c
@@ -242,9 +242,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->prepare = prepare;
   operation_class->get_bounding_box = get_bounding_box;
 
-  operation_class->name        = "gegl:noise-reduction";
-  operation_class->categories  = "enhance";
-  operation_class->description = "Anisotropic like smoothing operation";
+  gegl_operation_class_set_keys (operation_class,
+    "name"       , "gegl:noise-reduction",
+    "categories" , "enhance",
+    "description", "Anisotropic like smoothing operation",
+    NULL);
 }
 
 #endif
diff --git a/operations/common/noise-spread.c b/operations/common/noise-spread.c
index 42eea57..3a82116 100644
--- a/operations/common/noise-spread.c
+++ b/operations/common/noise-spread.c
@@ -166,9 +166,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   filter_class->process    = process;
   operation_class->prepare = prepare;
 
-  operation_class->categories  = "noise";
-  operation_class->name        = "gegl:noise-spread";
-  operation_class->description = _("Spread filter");
+  gegl_operation_class_set_keys (operation_class,
+    "categories" , "noise",
+    "name"       , "gegl:noise-spread",
+    "description", _("Spread filter"),
+    NULL);
 }
 
 
diff --git a/operations/common/noise.c b/operations/common/noise.c
index a5cedc1..188a0d9 100644
--- a/operations/common/noise.c
+++ b/operations/common/noise.c
@@ -97,13 +97,15 @@ gegl_chant_class_init (GeglChantClass *klass)
   point_render_class->process = process;
   operation_class->get_bounding_box = get_bounding_box;
   operation_class->prepare = prepare;
-
-  operation_class->name        = "gegl:perlin-noise";
-  operation_class->categories  = "render";
-  operation_class->description = _("Perlin noise generator.");
-
   operation_class->no_cache = TRUE;
   operation_class->get_cached_region = NULL;
+
+  gegl_operation_class_set_keys (operation_class,
+    "name"       , "gegl:perlin-noise",
+    "categories" , "render",
+    "description", _("Perlin noise generator."),
+    NULL);
+
 }
 
 #endif
diff --git a/operations/common/opacity.c b/operations/common/opacity.c
index d9f7a81..e736078 100644
--- a/operations/common/opacity.c
+++ b/operations/common/opacity.c
@@ -216,13 +216,14 @@ gegl_chant_class_init (GeglChantClass *klass)
   point_composer_class->process = process;
   point_composer_class->cl_process = cl_process;
 
-  operation_class->name        = "gegl:opacity";
   operation_class->opencl_support = TRUE;
-
-  operation_class->categories  = "transparency";
-  operation_class->description =
-        _("Weights the opacity of the input both the value of the aux"
-          " input and the global value property.");
+  gegl_operation_class_set_keys (operation_class,
+    "name"       , "gegl:opacity",
+    "categories" , "transparency",
+    "description",
+          _("Weights the opacity of the input both the value of the aux"
+            " input and the global value property."),
+    NULL);
 }
 
 #endif
diff --git a/operations/common/open-buffer.c b/operations/common/open-buffer.c
index 3d5fff8..e1f74d2 100644
--- a/operations/common/open-buffer.c
+++ b/operations/common/open-buffer.c
@@ -124,9 +124,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->get_bounding_box = get_bounding_box;
   operation_class->get_cached_region = get_cached_region;
 
-  operation_class->name        = "gegl:open-buffer";
-  operation_class->categories  = "input";
-  operation_class->description = _("A source that uses an on-disk GeglBuffer.");
+  gegl_operation_class_set_keys (operation_class,
+    "name"       , "gegl:open-buffer",
+    "categories" , "input",
+    "description", _("A source that uses an on-disk GeglBuffer."),
+    NULL);
 
   operation_class->no_cache = TRUE;
 }
diff --git a/operations/common/over.c b/operations/common/over.c
index f0a8f62..548df45 100644
--- a/operations/common/over.c
+++ b/operations/common/over.c
@@ -189,12 +189,16 @@ gegl_chant_class_init (GeglChantClass *klass)
   point_composer_class->process = process;
   point_composer_class->cl_process = cl_process;
 
-  operation_class->compat_name = "gegl:over";
-  operation_class->name        = "svg:src-over";
   operation_class->opencl_support = TRUE;
-  operation_class->description =
-        _("Porter Duff operation over (d = cA + cB * (1 - aA))");
-  operation_class->categories  = "compositors:porter-duff";
+  
+  operation_class->compat_name = "gegl:over";
+
+  gegl_operation_class_set_keys (operation_class,
+    "name"       , "svg:src-over",
+    "categories" , "compositors:porter-duff",
+    "description",
+          _("Porter Duff operation over (d = cA + cB * (1 - aA))"),
+    NULL);
 }
 
 #endif
diff --git a/operations/common/pixelise.c b/operations/common/pixelise.c
index 80cf4e0..89167b2 100644
--- a/operations/common/pixelise.c
+++ b/operations/common/pixelise.c
@@ -175,10 +175,12 @@ gegl_chant_class_init (GeglChantClass *klass)
   filter_class->process    = process;
   operation_class->prepare = prepare;
 
-  operation_class->categories  = "blur";
-  operation_class->name        = "gegl:pixelise";
-  operation_class->description =
-       _("Pixelise filter");
+  gegl_operation_class_set_keys (operation_class,
+    "categories" , "blur",
+    "name"       , "gegl:pixelise",
+    "description",
+         _("Pixelise filter"),
+    NULL);
 }
 
 #endif
diff --git a/operations/common/plasma.c b/operations/common/plasma.c
index 0f81817..a553c02 100644
--- a/operations/common/plasma.c
+++ b/operations/common/plasma.c
@@ -382,9 +382,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->get_required_for_output = get_required_for_output;
   operation_class->get_cached_region       = get_cached_region;
 
-  operation_class->categories  = "render";
-  operation_class->name        = "gegl:plasma";
-  operation_class->description = _("Performs plasma on the image.");
+  gegl_operation_class_set_keys (operation_class,
+    "name"       , "gegl:plasma",
+    "categories" , "render",
+    "description", _("Performs plasma on the image."),
+    NULL);
 }
 
 #endif
diff --git a/operations/common/polar-coordinates.c b/operations/common/polar-coordinates.c
index bd56901..bd36b99 100644
--- a/operations/common/polar-coordinates.c
+++ b/operations/common/polar-coordinates.c
@@ -396,10 +396,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->get_bounding_box        = get_bounding_box;
   operation_class->get_required_for_output = get_required_for_output;
 
-
-  operation_class->categories  = "enhance";
-  operation_class->name        = "gegl:polar-coordinates";
-  operation_class->description = _("Performs polar-coordinates on the image.");
+  gegl_operation_class_set_keys (operation_class,
+    "name"       , "gegl:polar-coordinates",
+    "categories" , "enhance",
+    "description", _("Performs polar-coordinates on the image."),
+    NULL);
 }
 
 #endif
diff --git a/operations/common/posterize.c b/operations/common/posterize.c
index d97dc07..146e6f9 100644
--- a/operations/common/posterize.c
+++ b/operations/common/posterize.c
@@ -75,10 +75,12 @@ gegl_chant_class_init (GeglChantClass *klass)
 
   point_filter_class->process = process;
 
-  operation_class->name        = "gegl:posterize";
-  operation_class->categories  = "color";
-  operation_class->description =
-     _("Reduces the number of levels in each color component of the image.");
+  gegl_operation_class_set_keys (operation_class,
+    "name"       , "gegl:posterize",
+    "categories" , "color",
+    "description",
+       _("Reduces the number of levels in each color component of the image."),
+       NULL);
 
 }
 
diff --git a/operations/common/raw-load.c b/operations/common/raw-load.c
index 14547bf..7c64a14 100644
--- a/operations/common/raw-load.c
+++ b/operations/common/raw-load.c
@@ -176,10 +176,12 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->get_bounding_box = get_bounding_box;
   operation_class->get_cached_region = get_cached_region;;
 
-  operation_class->name        = "gegl:raw-load";
-  operation_class->categories  = "hidden";
-  operation_class->description =
-        _("Raw image loader, wrapping dcraw with pipes.");
+  gegl_operation_class_set_keys (operation_class,
+    "name"       , "gegl:raw-load",
+    "categories" , "hidden",
+    "description",
+          _("Raw image loader, wrapping dcraw with pipes."),
+    NULL);
 
   gegl_extension_handler_register (".raw", "gegl:raw-load");
   gegl_extension_handler_register (".raf", "gegl:raw-load");
diff --git a/operations/common/rectangle.c b/operations/common/rectangle.c
index 64c4c14..3cb1c51 100644
--- a/operations/common/rectangle.c
+++ b/operations/common/rectangle.c
@@ -124,13 +124,15 @@ gegl_chant_class_init (GeglChantClass *klass)
 
   operation_class = GEGL_OPERATION_CLASS (klass);
 
-  operation_class->name        = "gegl:rectangle";
-  operation_class->categories  = "input";
-  operation_class->description =
-        _("A rectangular source of a fixed size with a solid color");
   operation_class->attach = attach;
   operation_class->prepare = prepare;
-}
 
+  gegl_operation_class_set_keys (operation_class,
+  "name"       , "gegl:rectangle",
+  "categories" , "input",
+  "description",
+        _("A rectangular source of a fixed size with a solid color"),
+        NULL);
+}
 
 #endif
diff --git a/operations/common/reinhard05.c b/operations/common/reinhard05.c
index c17baa3..bb3fcf0 100644
--- a/operations/common/reinhard05.c
+++ b/operations/common/reinhard05.c
@@ -267,13 +267,15 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->get_required_for_output = reinhard05_get_required_for_output;
   operation_class->get_cached_region       = reinhard05_get_cached_region;
 
-  operation_class->name        = "gegl:reinhard05";
-  operation_class->categories  = "tonemapping";
-  operation_class->description =
+  gegl_operation_class_set_keys (operation_class,
+  "name"       , "gegl:reinhard05",
+  "categories" , "tonemapping",
+  "description",
         _("Adapt an image, which may have a high dynamic range, for "
 	  "presentation using a low dynamic range. This is an efficient "
           "global operator derived from simple physiological observations, "
-          "producing luminance within the range 0.0-1.0");
+          "producing luminance within the range 0.0-1.0"),
+        NULL);
 }
 
 #endif
diff --git a/operations/common/remap.c b/operations/common/remap.c
index 7c1ef53..acfed14 100644
--- a/operations/common/remap.c
+++ b/operations/common/remap.c
@@ -90,10 +90,12 @@ gegl_chant_class_init (GeglChantClass *klass)
 
   point_composer3_class->process = process;
 
-  operation_class->name        = "gegl:remap";
-  operation_class->description =
-        _("stretch components of pixels individually based on luminance envelopes");
-  operation_class->categories  = "compositors:porter-duff";
+  gegl_operation_class_set_keys (operation_class,
+    "name"       , "gegl:remap",
+    "description",
+          _("stretch components of pixels individually based on luminance envelopes"),
+    "categories" , "compositors:porter-duff",
+    NULL);
 }
 
 #endif
diff --git a/operations/common/ripple.c b/operations/common/ripple.c
index af06b7b..c2d32fa 100644
--- a/operations/common/ripple.c
+++ b/operations/common/ripple.c
@@ -158,9 +158,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   filter_class->process    = process;
   operation_class->prepare = prepare;
 
-  operation_class->categories  = "distort";
-  operation_class->name        = "gegl:ripple";
-  operation_class->description = _("Transform the buffer with a ripple pattern");
+  gegl_operation_class_set_keys (operation_class,
+    "categories" , "distort",
+    "name"       , "gegl:ripple",
+    "description", _("Transform the buffer with a ripple pattern"),
+    NULL);
 }
 
 #endif
diff --git a/operations/common/save.c b/operations/common/save.c
index 42c3f3f..7990305 100644
--- a/operations/common/save.c
+++ b/operations/common/save.c
@@ -188,10 +188,12 @@ gegl_chant_class_init (GeglChantClass *klass)
 
   sink_class->needs_full = TRUE;
 
-  operation_class->name        = "gegl:save";
-  operation_class->categories  = "meta:output";
-  operation_class->description =
-        _("Multipurpose file saver, that uses other native handlers.");
+  gegl_operation_class_set_keys (operation_class,
+    "name"       , "gegl:save",
+    "categories" , "meta:output",
+    "description",
+        _("Multipurpose file saver, that uses other native handlers."),
+        NULL);
 }
 
 #endif
diff --git a/operations/common/snn-mean.c b/operations/common/snn-mean.c
index 82796c9..799b481 100644
--- a/operations/common/snn-mean.c
+++ b/operations/common/snn-mean.c
@@ -221,11 +221,13 @@ gegl_chant_class_init (GeglChantClass *klass)
   filter_class->process   = process;
   operation_class->prepare = prepare;
 
-  operation_class->name        = "gegl:snn-mean";
-  operation_class->categories  = "misc";
-  operation_class->description =
+  gegl_operation_class_set_keys (operation_class,
+    "name"       , "gegl:snn-mean",
+    "categories" , "misc",
+    "description",
         _("Noise reducing edge enhancing blur filter based "
-          " on Symmetric Nearest Neighbours");
+          " on Symmetric Nearest Neighbours"),
+        NULL);
 }
 
 #endif
diff --git a/operations/common/stress.c b/operations/common/stress.c
index 8d23082..c1c8434 100644
--- a/operations/common/stress.c
+++ b/operations/common/stress.c
@@ -184,10 +184,12 @@ gegl_chant_class_init (GeglChantClass *klass)
    */
   operation_class->get_bounding_box = get_bounding_box;
 
-  operation_class->name        = "gegl:stress";
-  operation_class->categories  = "enhance";
-  operation_class->description =
-        _("Spatio Temporal Retinex-like Envelope with Stochastic Sampling.");
+  gegl_operation_class_set_keys (operation_class,
+    "name"       , "gegl:stress",
+    "categories" , "enhance",
+    "description",
+        _("Spatio Temporal Retinex-like Envelope with Stochastic Sampling."),
+        NULL);
 }
 
 #endif
diff --git a/operations/common/stretch-contrast.c b/operations/common/stretch-contrast.c
index 77b6516..961dcc5 100644
--- a/operations/common/stretch-contrast.c
+++ b/operations/common/stretch-contrast.c
@@ -155,12 +155,14 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->prepare = prepare;
   operation_class->get_required_for_output = get_required_for_output;
 
-  operation_class->name        = "gegl:stretch-contrast";
-  operation_class->categories  = "color:enhance";
-  operation_class->description =
+  gegl_operation_class_set_keys (operation_class,
+    "name"       , "gegl:stretch-contrast",
+    "categories" , "color:enhance",
+    "description",
         _("Scales the components of the buffer to be in the 0.0-1.0 range. "
           "This improves images that make poor use of the available contrast "
-          "(little contrast, very dark, or very bright images).");
+          "(little contrast, very dark, or very bright images)."),
+        NULL);
 }
 
 #endif
diff --git a/operations/common/svg-huerotate.c b/operations/common/svg-huerotate.c
index 4824d1e..3e4067d 100644
--- a/operations/common/svg-huerotate.c
+++ b/operations/common/svg-huerotate.c
@@ -110,9 +110,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   point_filter_class->process = process;
   operation_class->prepare = prepare;
 
-  operation_class->name        = "gegl:svg-huerotate";
-  operation_class->categories  = "compositors:svgfilter";
-  operation_class->description = _("SVG color matrix operation svg_huerotate");
+  gegl_operation_class_set_keys (operation_class,
+    "name"       , "gegl:svg-huerotate",
+    "categories" , "compositors:svgfilter",
+    "description", _("SVG color matrix operation svg_huerotate"),
+    NULL);
 }
 
 #endif
diff --git a/operations/common/svg-luminancetoalpha.c b/operations/common/svg-luminancetoalpha.c
index 1530565..f66c576 100644
--- a/operations/common/svg-luminancetoalpha.c
+++ b/operations/common/svg-luminancetoalpha.c
@@ -88,10 +88,12 @@ gegl_chant_class_init (GeglChantClass *klass)
   point_filter_class->process = process;
   operation_class->prepare = prepare;
 
-  operation_class->name        = "gegl:svg-luminancetoalpha";
-  operation_class->categories  = "compositors:svgfilter";
-  operation_class->description =
-        _("SVG color matrix operation svg_luminancetoalpha");
+  gegl_operation_class_set_keys (operation_class,
+    "name"       , "gegl:svg-luminancetoalpha",
+    "categories" , "compositors:svgfilter",
+    "description",
+       _("SVG color matrix operation svg_luminancetoalpha"),
+        NULL);
 }
 
 #endif
diff --git a/operations/common/svg-matrix.c b/operations/common/svg-matrix.c
index c8a220b..2dad080 100644
--- a/operations/common/svg-matrix.c
+++ b/operations/common/svg-matrix.c
@@ -126,9 +126,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   point_filter_class->process = process;
   operation_class->prepare = prepare;
 
-  operation_class->name        = "gegl:svg-matrix";
-  operation_class->categories  = "compositors:svgfilter";
-  operation_class->description = _("SVG color matrix operation svg_matrix");
+  gegl_operation_class_set_keys (operation_class,
+    "name"       , "gegl:svg-matrix",
+    "categories" , "compositors:svgfilter",
+    "description", _("SVG color matrix operation svg_matrix"),
+    NULL);
 }
 
 #endif
diff --git a/operations/common/svg-saturate.c b/operations/common/svg-saturate.c
index 9696508..9c79abc 100644
--- a/operations/common/svg-saturate.c
+++ b/operations/common/svg-saturate.c
@@ -121,9 +121,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   point_filter_class->process = process;
   operation_class->prepare = prepare;
 
-  operation_class->name        = "gegl:svg-saturate";
-  operation_class->categories  = "compositors:svgfilter";
-  operation_class->description = _("SVG color matrix operation svg_saturate");
+  gegl_operation_class_set_keys (operation_class,
+    "name"       , "gegl:svg-saturate",
+    "categories" , "compositors:svgfilter",
+    "description", _("SVG color matrix operation svg_saturate"),
+    NULL);
 }
 
 #endif
diff --git a/operations/common/threshold.c b/operations/common/threshold.c
index 090531b..1767f87 100644
--- a/operations/common/threshold.c
+++ b/operations/common/threshold.c
@@ -183,13 +183,15 @@ gegl_chant_class_init (GeglChantClass *klass)
   point_composer_class->process = process;
   point_composer_class->cl_process = cl_process;
   operation_class->prepare = prepare;
-
-  operation_class->name        = "gegl:threshold";
   operation_class->opencl_support = TRUE;
-  operation_class->categories  = "color";
-  operation_class->description =
-        _("Thresholds the image to white/black based on either the global value "
-          "set in the value property, or per pixel from the aux input.");
+
+  gegl_operation_class_set_keys (operation_class,
+    "name"       , "gegl:threshold",
+    "categories" , "color",
+    "description",
+          _("Thresholds the image to white/black based on either the global value "
+            "set in the value property, or per pixel from the aux input."),
+          NULL);
 }
 
 #endif
diff --git a/operations/common/unsharp-mask.c b/operations/common/unsharp-mask.c
index fa34e71..f439568 100644
--- a/operations/common/unsharp-mask.c
+++ b/operations/common/unsharp-mask.c
@@ -65,11 +65,13 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class = GEGL_OPERATION_CLASS (klass);
   operation_class->attach = attach;
 
-  operation_class->name        = "gegl:unsharp-mask";
-  operation_class->categories  = "meta:enhance";
-  operation_class->description =
+  gegl_operation_class_set_keys (operation_class,
+  "name"       , "gegl:unsharp-mask",
+  "categories" , "meta:enhance",
+  "description",
         _("Performs an unsharp mask on the input buffer (sharpens an image by "
-          "adding false mach-bands around edges).");
+          "adding false mach-bands around edges)."),
+        NULL);
 }
 
 #endif
diff --git a/operations/common/value-invert.c b/operations/common/value-invert.c
index 2cfcb63..34d59bc 100644
--- a/operations/common/value-invert.c
+++ b/operations/common/value-invert.c
@@ -209,12 +209,15 @@ gegl_chant_class_init (GeglChantClass *klass)
   point_filter_class->process = process;
   point_filter_class->cl_process = cl_process;
 
-  operation_class->name        = "gegl:value-invert";
   operation_class->opencl_support = TRUE;
-  operation_class->categories  = "color";
-  operation_class->description =
+
+  gegl_operation_class_set_keys (operation_class,
+    "name"       , "gegl:value-invert",
+    "categories" , "color",
+    "description",
         _("Inverts just the value component, the result is the corresponding "
-          "`inverted' image.");
+          "`inverted' image."),
+        NULL);
 }
 
 #endif
diff --git a/operations/common/vignette.c b/operations/common/vignette.c
index d21a979..3c0fa7b 100644
--- a/operations/common/vignette.c
+++ b/operations/common/vignette.c
@@ -214,9 +214,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->prepare = prepare;
   operation_class->no_cache = TRUE;
 
-  operation_class->name        = "gegl:vignette";
-  operation_class->categories  = "render";
-  operation_class->description = _("A vignetting op, applies a vignette to an image. Simulates the luminance fall off at edge of exposed film, and some other fuzzier border effects that can naturally occur with analoge photograpy.");
+  gegl_operation_class_set_keys (operation_class,
+  "name"       , "gegl:vignette",
+  "categories" , "render",
+  "description", _("A vignetting op, applies a vignette to an image. Simulates the luminance fall off at edge of exposed film, and some other fuzzier border effects that can naturally occur with analoge photograpy."),
+  NULL);
 }
 
 #endif
diff --git a/operations/common/waves.c b/operations/common/waves.c
index 157d89a..ef0689b 100644
--- a/operations/common/waves.c
+++ b/operations/common/waves.c
@@ -158,9 +158,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   filter_class->process    = process;
   operation_class->prepare = prepare;
 
-  operation_class->categories  = "distort";
-  operation_class->name        = "gegl:waves";
-  operation_class->description = _("Transform the buffer with waves");
+  gegl_operation_class_set_keys (operation_class,
+    "name"       , "gegl:waves",
+    "categories" , "distort",
+    "description", _("Transform the buffer with waves"),
+    NULL);
 }
 
 #endif
diff --git a/operations/common/weighted-blend.c b/operations/common/weighted-blend.c
index cd9ab05..960b468 100644
--- a/operations/common/weighted-blend.c
+++ b/operations/common/weighted-blend.c
@@ -117,9 +117,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   point_composer_class->process = process;
   operation_class->prepare      = prepare;
 
-  operation_class->name        = "gegl:weighted-blend";
-  operation_class->categories  = "compositors:blend";
-  operation_class->description =
-    _("blend two images using alpha values as weights");
+  gegl_operation_class_set_keys (operation_class,
+    "name"       , "gegl:weighted-blend",
+    "categories" , "compositors:blend",
+    "description",
+      _("blend two images using alpha values as weights"),
+    NULL);
 }
 #endif
diff --git a/operations/common/whitebalance.c b/operations/common/whitebalance.c
index a6af68d..6176010 100644
--- a/operations/common/whitebalance.c
+++ b/operations/common/whitebalance.c
@@ -171,11 +171,14 @@ gegl_chant_class_init (GeglChantClass *klass)
   point_filter_class->cl_process = cl_process;
   operation_class->prepare = prepare;
 
-  operation_class->name        = "gegl:whitebalance";
   operation_class->opencl_support = TRUE;
-  operation_class->categories  = "color";
-  operation_class->description =
-        _("Allows changing the whitepoint and blackpoint of an image.");
+
+  gegl_operation_class_set_keys (operation_class,
+    "name"        , "gegl:whitebalance",
+    "categories"  , "color",
+    "description" ,
+          _("Allows changing the whitepoint and blackpoint of an image."),
+        NULL);
 }
 
 #endif
diff --git a/operations/common/write-buffer.c b/operations/common/write-buffer.c
index cec4272..10114d6 100644
--- a/operations/common/write-buffer.c
+++ b/operations/common/write-buffer.c
@@ -81,9 +81,11 @@ gegl_chant_class_init (GeglChantClass *klass)
 
   G_OBJECT_CLASS (klass)->dispose = dispose;
 
-  operation_class->name        = "gegl:write-buffer";
-  operation_class->categories  = "programming:output";
-  operation_class->description = _("A GEGL buffer destination surface.");
+  gegl_operation_class_set_keys (operation_class,
+    "name"       , "gegl:write-buffer",
+    "categories" , "programming:output",
+    "description", _("A GEGL buffer destination surface."),
+    NULL);
 }
 
 #endif
diff --git a/operations/core/clone.c b/operations/core/clone.c
index 19465b5..6243c33 100644
--- a/operations/core/clone.c
+++ b/operations/core/clone.c
@@ -105,12 +105,13 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->process = process;
   operation_class->get_bounding_box = get_bounding_box;
   operation_class->detect = detect;
-
-  operation_class->name        = "gegl:clone";
-  operation_class->categories  = "core";
-  operation_class->description = _("Clone a buffer");
-
   operation_class->no_cache = TRUE;
+
+  gegl_operation_class_set_keys (operation_class,
+       "name",          "gegl:clone",
+       "description",   _("Clone a buffer"),
+       "categories",    "core",
+       NULL);
 }
 
 #endif
diff --git a/operations/core/convert-format.c b/operations/core/convert-format.c
index f3ba46e..e792dcf 100644
--- a/operations/core/convert-format.c
+++ b/operations/core/convert-format.c
@@ -75,10 +75,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   point_filter_class->process = process;
   operation_class->prepare = prepare;
 
-  operation_class->name       = "gegl:convert-format";
-  operation_class->categories = "core:color";
-  operation_class->description =
-        _("Convert the data to the specified format");
+  gegl_operation_class_set_keys (operation_class,
+                "name",       "gegl:convert-format",
+                "categories", "core:color",
+                "description", _("Convert the data to the specified format"),
+                NULL);
 }
 
 #endif
diff --git a/operations/core/crop.c b/operations/core/crop.c
index 978f26b..35b5992 100644
--- a/operations/core/crop.c
+++ b/operations/core/crop.c
@@ -173,9 +173,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->get_invalidated_by_change = gegl_crop_get_invalidated_by_change;
   operation_class->get_required_for_output   = gegl_crop_get_required_for_output;
 
-  operation_class->name        = "gegl:crop";
-  operation_class->categories  = "core";
-  operation_class->description = _("Crop a buffer");
+  gegl_operation_class_set_keys (operation_class,
+      "name",        "gegl:crop",
+      "categories",  "core",
+      "description", _("Crop a buffer"),
+      NULL);
 
   operation_class->no_cache = TRUE;
 }
diff --git a/operations/core/nop.c b/operations/core/nop.c
index 68f78cb..45ef394 100644
--- a/operations/core/nop.c
+++ b/operations/core/nop.c
@@ -66,9 +66,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class = GEGL_OPERATION_CLASS (klass);
   operation_class->process = gegl_nop_process;
 
-  operation_class->name       = "gegl:nop";
-  operation_class->categories = "core";
-  operation_class->description = _("No operation (can be used as a routing point)");
+  gegl_operation_class_set_keys (operation_class,
+              "name",        "gegl:nop",
+              "categories",  "core",
+              "description", _("No operation (can be used as a routing point)"),
+              NULL);
 }
 
 #endif
diff --git a/operations/external/exr-load.cpp b/operations/external/exr-load.cpp
index 56b76a4..719cd44 100644
--- a/operations/external/exr-load.cpp
+++ b/operations/external/exr-load.cpp
@@ -665,9 +665,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->get_bounding_box = get_bounding_box;
 
   operation_class->get_cached_region = get_cached_region;
-  operation_class->name        = "gegl:exr-load";
-  operation_class->categories  = "hidden";
-  operation_class->description = "EXR image loader.";
+
+  gegl_operation_class_set_keys (operation_class,
+    "name"        , "gegl:exr-load",
+    "categories"  , "hidden",
+    "description" , "EXR image loader.", NULL);
 
   gegl_extension_handler_register (".exr", "gegl:exr-load");
 }
diff --git a/operations/external/exr-save.cc b/operations/external/exr-save.cc
index eb0fb0b..e704359 100644
--- a/operations/external/exr-save.cc
+++ b/operations/external/exr-save.cc
@@ -242,9 +242,11 @@ static void gegl_chant_class_init (GeglChantClass *klass)
   sink_class->process = gegl_exr_save_process;
   sink_class->needs_full = TRUE;
 
-  operation_class->name        = "gegl:exr-save";
-  operation_class->categories  = "output";
-  operation_class->description = "OpenEXR image saver";
+  gegl_operation_class_set_keys (operation_class,
+    "name"        , "gegl:exr-save",
+    "categories"  , "output",
+    "description" , "OpenEXR image saver",
+    NULL);
 
   gegl_extension_handler_register_saver (".exr", "gegl:exr-save");
 }
diff --git a/operations/external/ff-load.c b/operations/external/ff-load.c
index 15f7327..5814460 100644
--- a/operations/external/ff-load.c
+++ b/operations/external/ff-load.c
@@ -465,9 +465,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->get_cached_region = get_cached_region;
   operation_class->prepare = prepare;
 
-  operation_class->name        = "gegl:ff-load";
-  operation_class->categories  = "input:video";
-  operation_class->description = _("FFmpeg video frame importer.");
+  gegl_operation_class_set_keys (operation_class,
+    "name"        , "gegl:ff-load",
+    "categories"  , "input:video",
+    "description" , _("FFmpeg video frame importer."),
+    NULL);
 }
 
 #endif
diff --git a/operations/external/jp2-load.c b/operations/external/jp2-load.c
index db7d0d3..a019454 100644
--- a/operations/external/jp2-load.c
+++ b/operations/external/jp2-load.c
@@ -391,9 +391,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->get_bounding_box = get_bounding_box;
   operation_class->get_cached_region = get_cached_region;
 
-  operation_class->name        = "gegl:jp2-load";
-  operation_class->categories  = "hidden";
-  operation_class->description = _("JPEG-2000 image loader.");
+  gegl_operation_class_set_keys (operation_class,
+    "name"        , "gegl:jp2-load",
+    "categories"  , "hidden",
+    "description" , _("JPEG-2000 image loader."),
+    NULL);
 
   gegl_extension_handler_register (".jp2", "gegl:jp2-load");
   gegl_extension_handler_register (".jpx", "gegl:jp2-load");
diff --git a/operations/external/jpg-load.c b/operations/external/jpg-load.c
index 1f3f8af..af1806b 100644
--- a/operations/external/jpg-load.c
+++ b/operations/external/jpg-load.c
@@ -217,9 +217,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->get_bounding_box = gegl_jpg_load_get_bounding_box;
   operation_class->get_cached_region = gegl_jpg_load_get_cached_region;
 
-  operation_class->name        = "gegl:jpg-load";
-  operation_class->categories  = "hidden";
-  operation_class->description = _("JPG image loader");
+  gegl_operation_class_set_keys (operation_class,
+    "name"        , "gegl:jpg-load",
+    "categories"  , "hidden",
+    "description" , _("JPG image loader"),
+    NULL);
 
 /*  static gboolean done=FALSE;
     if (done)
diff --git a/operations/external/jpg-save.c b/operations/external/jpg-save.c
index 76c2b8f..082a3dc 100644
--- a/operations/external/jpg-save.c
+++ b/operations/external/jpg-save.c
@@ -185,10 +185,12 @@ gegl_chant_class_init (GeglChantClass *klass)
   sink_class->process    = gegl_jpg_save_process;
   sink_class->needs_full = TRUE;
 
-  operation_class->name        = "gegl:jpg-save";
-  operation_class->categories  = "output";
-  operation_class->description =
-    _("JPEG image saver (passes the buffer through, saves as a side-effect.)");
+  gegl_operation_class_set_keys (operation_class,
+    "name"        , "gegl:jpg-save",
+    "categories"  , "output",
+    "description" ,
+    _("JPEG image saver (passes the buffer through, saves as a side-effect.)"),
+    NULL);
 
   gegl_extension_handler_register_saver (".jpg", "gegl:jpg-save");
 }
diff --git a/operations/external/matting-levin.c b/operations/external/matting-levin.c
index a73e3bc..9add013 100644
--- a/operations/external/matting-levin.c
+++ b/operations/external/matting-levin.c
@@ -1421,12 +1421,14 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->get_required_for_output = matting_get_required_for_output;
   operation_class->get_cached_region       = matting_get_cached_region;
 
-  operation_class->name        = "gegl:matting-levin";
-  operation_class->categories  = "misc";
-  operation_class->description =
+  gegl_operation_class_set_keys (operation_class,
+  "name"        , "gegl:matting-levin",
+  "categories"  , "misc",
+  "description" ,
         _("Given a sparse user supplied tri-map and an input image, create a "
           "foreground alpha mat. Set white as selected, black as unselected, "
-          "for the tri-map.");
+          "for the tri-map."),
+        NULL);
 }
 
 
diff --git a/operations/external/openraw.c b/operations/external/openraw.c
index cb0d50c..9fc1e95 100644
--- a/operations/external/openraw.c
+++ b/operations/external/openraw.c
@@ -234,12 +234,14 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->process = process;
   operation_class->get_bounding_box = get_bounding_box;
   operation_class->get_cached_region = get_cached_region;
-
-  operation_class->name        = "gegl:openraw-load";
-  operation_class->categories  = "hidden";
-  operation_class->description = "Camera RAW image loader";
   operation_class->prepare     = prepare;
 
+  gegl_operation_class_set_keys (operation_class,
+    "name"        , "gegl:openraw-load",
+    "categories"  , "hidden",
+    "description" , "Camera RAW image loader",
+    NULL);
+
   if (done)
     return;
 
diff --git a/operations/external/path.c b/operations/external/path.c
index 0cc1d3d..5adf573 100644
--- a/operations/external/path.c
+++ b/operations/external/path.c
@@ -512,9 +512,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->detect = detect;
   /*operation_class->no_cache = TRUE;*/
 
-  operation_class->name        = "gegl:path";
-  operation_class->categories  = "render";
-  operation_class->description = _("Renders a brush stroke");
+  gegl_operation_class_set_keys (operation_class,
+    "name"        , "gegl:path",
+    "categories"  , "render",
+    "description" , _("Renders a brush stroke"),
+    NULL);
 }
 
 
diff --git a/operations/external/pixbuf.c b/operations/external/pixbuf.c
index 811f952..8e5f28f 100644
--- a/operations/external/pixbuf.c
+++ b/operations/external/pixbuf.c
@@ -96,10 +96,12 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->prepare = prepare;
   /*operation_class->no_cache = TRUE;*/
 
-  operation_class->name        = "gegl:pixbuf";
-  operation_class->categories  = "programming:input";
-  operation_class->description =
-        _("Uses the GdkPixbuf located at the memory location in <em>pixbuf</em>.");
+  gegl_operation_class_set_keys (operation_class,
+    "name"        , "gegl:pixbuf",
+    "categories"  , "programming:input",
+    "description" ,
+          _("Uses the GdkPixbuf located at the memory location in <em>pixbuf</em>."),
+          NULL);
 }
 
 #endif
diff --git a/operations/external/png-load.c b/operations/external/png-load.c
index 7a4212e..89fc9a6 100644
--- a/operations/external/png-load.c
+++ b/operations/external/png-load.c
@@ -440,9 +440,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->get_bounding_box = get_bounding_box;
   operation_class->get_cached_region = get_cached_region;
 
-  operation_class->name        = "gegl:png-load";
-  operation_class->categories  = "hidden";
-  operation_class->description = _("PNG image loader.");
+  gegl_operation_class_set_keys (operation_class,
+    "name"        , "gegl:png-load",
+    "categories"  , "hidden",
+    "description" , _("PNG image loader."),
+    NULL);
 
 /*  static gboolean done=FALSE;
     if (done)
diff --git a/operations/external/png-save.c b/operations/external/png-save.c
index 511466d..5c994cf 100644
--- a/operations/external/png-save.c
+++ b/operations/external/png-save.c
@@ -226,10 +226,12 @@ gegl_chant_class_init (GeglChantClass *klass)
   sink_class->process    = gegl_png_save_process;
   sink_class->needs_full = TRUE;
 
-  operation_class->name        = "gegl:png-save";
-  operation_class->categories  = "output";
-  operation_class->description =
-        _("PNG image saver (passes the buffer through, saves as a side-effect.)");
+  gegl_operation_class_set_keys (operation_class,
+  "name"       , "gegl:png-save",
+  "categories" , "output",
+  "description",
+        _("PNG image saver (passes the buffer through, saves as a side-effect.)"),
+        NULL);
 
   gegl_extension_handler_register_saver (".png", "gegl:png-save");
 }
diff --git a/operations/external/ppm-load.c b/operations/external/ppm-load.c
index 3507160..efe6d56 100644
--- a/operations/external/ppm-load.c
+++ b/operations/external/ppm-load.c
@@ -300,9 +300,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->get_bounding_box = get_bounding_box;
   operation_class->get_cached_region = get_cached_region;
 
-  operation_class->name        = "gegl:ppm-load";
-  operation_class->categories  = "hidden";
-  operation_class->description = _("PPM image loader.");
+  gegl_operation_class_set_keys (operation_class,
+    "name"        , "gegl:ppm-load",
+    "categories"  , "hidden",
+    "description" , _("PPM image loader."),
+    NULL);
 
   gegl_extension_handler_register (".ppm", "gegl:ppm-load");
 }
diff --git a/operations/external/ppm-save.c b/operations/external/ppm-save.c
index dda89cc..0230d2f 100644
--- a/operations/external/ppm-save.c
+++ b/operations/external/ppm-save.c
@@ -183,10 +183,12 @@ gegl_chant_class_init (GeglChantClass *klass)
   sink_class->process = process;
   sink_class->needs_full = TRUE;
 
-  operation_class->name        = "gegl:ppm-save";
-  operation_class->categories  = "output";
-  operation_class->description =
-        _("PPM image saver (Portable pixmap saver.)");
+  gegl_operation_class_set_keys (operation_class,
+    "name"        , "gegl:ppm-save",
+    "categories"  , "output",
+    "description" ,
+        _("PPM image saver (Portable pixmap saver.)"),
+        NULL);
 
   gegl_extension_handler_register_saver (".ppm", "gegl:ppm-save");
 }
diff --git a/operations/external/rgbe-load.c b/operations/external/rgbe-load.c
index 6803f57..785b8cc 100644
--- a/operations/external/rgbe-load.c
+++ b/operations/external/rgbe-load.c
@@ -129,9 +129,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->get_bounding_box  = gegl_rgbe_load_get_bounding_box;
   operation_class->get_cached_region = gegl_rgbe_load_get_cached_region;
 
-  operation_class->name        = "gegl:rgbe-load";
-  operation_class->categories  = "hidden";
-  operation_class->description = _("RGBE image loader (Radiance HDR format).");
+  gegl_operation_class_set_keys (operation_class,
+    "name"        , "gegl:rgbe-load",
+    "categories"  , "hidden",
+    "description" , _("RGBE image loader (Radiance HDR format)."),
+    NULL);
 
   gegl_extension_handler_register (".hdr", "gegl:rgbe-load");
   gegl_extension_handler_register (".pic", "gegl:rgbe-load");
diff --git a/operations/external/rgbe-save.c b/operations/external/rgbe-save.c
index d2c479e..1836121 100644
--- a/operations/external/rgbe-save.c
+++ b/operations/external/rgbe-save.c
@@ -79,10 +79,12 @@ gegl_chant_class_init (GeglChantClass *klass)
   sink_class->process = gegl_rgbe_save_process;
   sink_class->needs_full = TRUE;
 
-  operation_class->name        = "gegl:rgbe-save";
-  operation_class->categories  = "output";
-  operation_class->description =
-      _("RGBE image saver (Radiance HDR format)");
+  gegl_operation_class_set_keys (operation_class,
+    "name"        , "gegl:rgbe-save",
+    "categories"  , "output",
+    "description" ,
+        _("RGBE image saver (Radiance HDR format)"),
+    NULL);
 
   gegl_extension_handler_register_saver (".hdr", "gegl:rgbe-save");
   gegl_extension_handler_register_saver (".pic", "gegl:rgbe-save");
diff --git a/operations/external/save-pixbuf.c b/operations/external/save-pixbuf.c
index b657ba1..cb5b1d3 100644
--- a/operations/external/save-pixbuf.c
+++ b/operations/external/save-pixbuf.c
@@ -100,9 +100,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   sink_class->process = process;
   sink_class->needs_full = TRUE;
 
-  operation_class->name        = "gegl:save-pixbuf";
-  operation_class->categories  = "programming:output";
-  operation_class->description = _("Save output into a GdkPixbuf.");
+  gegl_operation_class_set_keys (operation_class,
+    "name"        , "gegl:save-pixbuf",
+    "categories"  , "programming:output",
+    "description" , _("Save output into a GdkPixbuf."),
+    NULL);
 
 }
 
diff --git a/operations/external/sdl-display.c b/operations/external/sdl-display.c
index 593107a..9a46d2f 100644
--- a/operations/external/sdl-display.c
+++ b/operations/external/sdl-display.c
@@ -174,10 +174,12 @@ gegl_chant_class_init (GeglChantClass *klass)
   sink_class->process = process;
   sink_class->needs_full = TRUE;
 
-  operation_class->name        = "gegl:sdl-display";
-  operation_class->categories  = "display";
-  operation_class->description =
+  gegl_operation_class_set_keys (operation_class,
+    "name"        , "gegl:sdl-display",
+    "categories"  , "display",
+    "description" ,
         _("Displays the input buffer in an SDL window (restricted to one"
-          " display op/process, due to SDL implementation issues).");
+          " display op/process, due to SDL implementation issues)."),
+        NULL);
 }
 #endif
diff --git a/operations/external/svg-load.c b/operations/external/svg-load.c
index f1c2693..cfb4142 100644
--- a/operations/external/svg-load.c
+++ b/operations/external/svg-load.c
@@ -239,9 +239,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->prepare = prepare;
   operation_class->get_bounding_box = get_bounding_box;
 
-  operation_class->name        = "gegl:svg-load";
-  operation_class->categories  = "input";   /* not hidden because it has extra API */
-  operation_class->description = _("Load an SVG file using librsvg");
+  gegl_operation_class_set_keys (operation_class,
+    "name"        , "gegl:svg-load",
+    "categories"  , "input",   /* not hidden because it has extra API */
+    "description" , _("Load an SVG file using librsvg"),
+    NULL);
 
 /*  static gboolean done=FALSE;
     if (done)
diff --git a/operations/external/text.c b/operations/external/text.c
index ef58884..bb7ac84 100644
--- a/operations/external/text.c
+++ b/operations/external/text.c
@@ -291,13 +291,16 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_source_class = GEGL_OPERATION_SOURCE_CLASS (klass);
 
   object_class->finalize = finalize;
-
-  operation_class->name        = "gegl:text";
-  operation_class->categories  = "render";
-  operation_class->description = _("Display a string of text using pango and cairo.");
   operation_class->prepare = prepare;
   operation_class->get_bounding_box = get_bounding_box;
   operation_source_class->process = process;
+
+  gegl_operation_class_set_keys (operation_class,
+    "name"        , "gegl:text",
+    "categories"  , "render",
+    "description" , _("Display a string of text using pango and cairo."),
+    NULL);
+
 }
 
 
diff --git a/operations/external/vector-fill.c b/operations/external/vector-fill.c
index 60a5abf..71a8311 100644
--- a/operations/external/vector-fill.c
+++ b/operations/external/vector-fill.c
@@ -252,9 +252,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->prepare = prepare;
   operation_class->detect = detect;
 
-  operation_class->name        = "gegl:fill-path";
-  operation_class->categories  = "render";
-  operation_class->description = _("Renders a filled region");
+  gegl_operation_class_set_keys (operation_class,
+    "name"       , "gegl:fill-path",
+    "categories" , "render",
+    "description", _("Renders a filled region"),
+    NULL);
 }
 
 
diff --git a/operations/external/vector-stroke.c b/operations/external/vector-stroke.c
index fcbdeb3..609a88e 100644
--- a/operations/external/vector-stroke.c
+++ b/operations/external/vector-stroke.c
@@ -274,9 +274,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->detect = detect;
   /*operation_class->no_cache = TRUE;*/
 
-  operation_class->name        = "gegl:vector-stroke";
-  operation_class->categories  = "render";
-  operation_class->description = _("Renders a vector stroke");
+  gegl_operation_class_set_keys (operation_class,
+    "name"        , "gegl:vector-stroke",
+    "categories"  , "render",
+    "description" , _("Renders a vector stroke"),
+    NULL);
 }
 
 
diff --git a/operations/generated/add.c b/operations/generated/add.c
index 2d10d72..06a44fc 100644
--- a/operations/generated/add.c
+++ b/operations/generated/add.c
@@ -118,9 +118,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   point_composer_class->process = process;
   operation_class->prepare = prepare;
 
-  operation_class->name        = "gegl:add";
-  operation_class->categories  = "compositors:math";
-  operation_class->description =
-       _("Math operation add (c = c + value)");
+  gegl_operation_class_set_keys (operation_class,
+  "name"        , "gegl:add",
+  "categories"  , "compositors:math",
+  "description" ,
+       _("Math operation add (c = c + value)"),
+       NULL);
 }
 #endif
diff --git a/operations/generated/clear.c b/operations/generated/clear.c
index 4106fbe..fc0905a 100644
--- a/operations/generated/clear.c
+++ b/operations/generated/clear.c
@@ -109,10 +109,14 @@ gegl_chant_class_init (GeglChantClass *klass)
 
 
   operation_class->compat_name = "gegl:clear";
-  operation_class->name        = "svg:clear";
-  operation_class->description =
-        _("Porter Duff operation clear (d = 0.0f)");
-  operation_class->categories  = "compositors:porter-duff";
+  gegl_operation_class_set_keys (operation_class,
+    "name"      , "svg:clear",
+    "categories", "compositors:porter-duff",
+    "description",
+        _("Porter Duff operation clear (d = 0.0f)"),
+        NULL);
+ 
+
 }
 
 #endif
diff --git a/operations/generated/color-burn.c b/operations/generated/color-burn.c
index c167a56..3cc174d 100644
--- a/operations/generated/color-burn.c
+++ b/operations/generated/color-burn.c
@@ -111,10 +111,12 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->prepare = prepare;
 
   operation_class->compat_name = "gegl:color-burn";
-  operation_class->name        = "svg:color-burn";
-  operation_class->description =
-        _("SVG blend operation color-burn (<tt>if cA * aB + cB * aA <= aA * aB: d = cA * (1 - aB) + cB * (1 - aA) otherwise: d = (cA == 0 ? 1 : (aA * (cA * aB + cB * aA - aA * aB) / cA) + cA * (1 - aB) + cB * (1 - aA))</tt>)");
-  operation_class->categories  = "compositors:svgfilter";
+  gegl_operation_class_set_keys (operation_class,
+  "name"        , "svg:color-burn",
+  "description" ,
+        _("SVG blend operation color-burn (<tt>if cA * aB + cB * aA <= aA * aB: d = cA * (1 - aB) + cB * (1 - aA) otherwise: d = (cA == 0 ? 1 : (aA * (cA * aB + cB * aA - aA * aB) / cA) + cA * (1 - aB) + cB * (1 - aA))</tt>)"),
+        NULL);
+  gegl_operation_class_set_key (operation_class, "categories", "compositors:svgfilter");
 }
 
 #endif
diff --git a/operations/generated/color-dodge.c b/operations/generated/color-dodge.c
index 17ad2a4..655392f 100644
--- a/operations/generated/color-dodge.c
+++ b/operations/generated/color-dodge.c
@@ -111,10 +111,12 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->prepare = prepare;
 
   operation_class->compat_name = "gegl:color-dodge";
-  operation_class->name        = "svg:color-dodge";
-  operation_class->description =
-        _("SVG blend operation color-dodge (<tt>if cA * aB + cB * aA >= aA * aB: d = aA * aB + cA * (1 - aB) + cB * (1 - aA) otherwise: d = (cA == aA ? 1 : cB * aA / (aA == 0 ? 1 : 1 - cA / aA)) + cA * (1 - aB) + cB * (1 - aA)</tt>)");
-  operation_class->categories  = "compositors:svgfilter";
+  gegl_operation_class_set_keys (operation_class,
+  "name"        , "svg:color-dodge",
+  "description" ,
+        _("SVG blend operation color-dodge (<tt>if cA * aB + cB * aA >= aA * aB: d = aA * aB + cA * (1 - aB) + cB * (1 - aA) otherwise: d = (cA == aA ? 1 : cB * aA / (aA == 0 ? 1 : 1 - cA / aA)) + cA * (1 - aB) + cB * (1 - aA)</tt>)"),
+        NULL);
+  gegl_operation_class_set_key (operation_class, "categories", "compositors:svgfilter");
 }
 
 #endif
diff --git a/operations/generated/darken.c b/operations/generated/darken.c
index 61c8fd6..4568982 100644
--- a/operations/generated/darken.c
+++ b/operations/generated/darken.c
@@ -108,10 +108,13 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->prepare = prepare;
 
   operation_class->compat_name = "gegl:darken";
-  operation_class->name        = "svg:darken";
-  operation_class->description =
-        _("SVG blend operation darken (<tt>d = MIN (cA * aB, cB * aA) + cA * (1 - aB) + cB * (1 - aA)</tt>)");
-  operation_class->categories  = "compositors:svgfilter";
+  
+  gegl_operation_class_set_keys (operation_class,
+  "name"        , "svg:darken",
+  "description" ,
+        _("SVG blend operation darken (<tt>d = MIN (cA * aB, cB * aA) + cA * (1 - aB) + cB * (1 - aA)</tt>)"),
+        NULL);
+  gegl_operation_class_set_key (operation_class, "categories", "compositors:svgfilter");
 }
 
 #endif
diff --git a/operations/generated/difference.c b/operations/generated/difference.c
index b348a5c..3c17a42 100644
--- a/operations/generated/difference.c
+++ b/operations/generated/difference.c
@@ -108,10 +108,13 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->prepare = prepare;
 
   operation_class->compat_name = "gegl:difference";
-  operation_class->name        = "svg:difference";
-  operation_class->description =
-        _("SVG blend operation difference (<tt>d = cA + cB - 2 * (MIN (cA * aB, cB * aA))</tt>)");
-  operation_class->categories  = "compositors:svgfilter";
+  
+  gegl_operation_class_set_keys (operation_class,
+  "name"        , "svg:difference",
+  "description" ,
+        _("SVG blend operation difference (<tt>d = cA + cB - 2 * (MIN (cA * aB, cB * aA))</tt>)"),
+        NULL);
+  gegl_operation_class_set_key (operation_class, "categories", "compositors:svgfilter");
 }
 
 #endif
diff --git a/operations/generated/divide.c b/operations/generated/divide.c
index 4edafb4..dbce77e 100644
--- a/operations/generated/divide.c
+++ b/operations/generated/divide.c
@@ -118,9 +118,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   point_composer_class->process = process;
   operation_class->prepare = prepare;
 
-  operation_class->name        = "gegl:divide";
-  operation_class->categories  = "compositors:math";
-  operation_class->description =
-       _("Math operation divide (c = value==0.0f?0.0f:c/value)");
+  gegl_operation_class_set_keys (operation_class,
+  "name"        , "gegl:divide",
+  "categories"  , "compositors:math",
+  "description" ,
+       _("Math operation divide (c = value==0.0f?0.0f:c/value)"),
+       NULL);
 }
 #endif
diff --git a/operations/generated/dst-atop.c b/operations/generated/dst-atop.c
index 78f58ad..82d236f 100644
--- a/operations/generated/dst-atop.c
+++ b/operations/generated/dst-atop.c
@@ -109,10 +109,14 @@ gegl_chant_class_init (GeglChantClass *klass)
 
 
   operation_class->compat_name = "gegl:dst-atop";
-  operation_class->name        = "svg:dst-atop";
-  operation_class->description =
-        _("Porter Duff operation dst-atop (d = cB * aA + cA * (1.0f - aB))");
-  operation_class->categories  = "compositors:porter-duff";
+  gegl_operation_class_set_keys (operation_class,
+    "name"      , "svg:dst-atop",
+    "categories", "compositors:porter-duff",
+    "description",
+        _("Porter Duff operation dst-atop (d = cB * aA + cA * (1.0f - aB))"),
+        NULL);
+ 
+
 }
 
 #endif
diff --git a/operations/generated/dst-in.c b/operations/generated/dst-in.c
index 8051e01..4b45edd 100644
--- a/operations/generated/dst-in.c
+++ b/operations/generated/dst-in.c
@@ -109,10 +109,14 @@ gegl_chant_class_init (GeglChantClass *klass)
 
 
   operation_class->compat_name = "gegl:dst-in";
-  operation_class->name        = "svg:dst-in";
-  operation_class->description =
-        _("Porter Duff operation dst-in (d = cB * aA)");
-  operation_class->categories  = "compositors:porter-duff";
+  gegl_operation_class_set_keys (operation_class,
+    "name"      , "svg:dst-in",
+    "categories", "compositors:porter-duff",
+    "description",
+        _("Porter Duff operation dst-in (d = cB * aA)"),
+        NULL);
+ 
+
 }
 
 #endif
diff --git a/operations/generated/dst-out.c b/operations/generated/dst-out.c
index a455319..23b0bb7 100644
--- a/operations/generated/dst-out.c
+++ b/operations/generated/dst-out.c
@@ -109,10 +109,14 @@ gegl_chant_class_init (GeglChantClass *klass)
 
 
   operation_class->compat_name = "gegl:dst-out";
-  operation_class->name        = "svg:dst-out";
-  operation_class->description =
-        _("Porter Duff operation dst-out (d = cB * (1.0f - aA))");
-  operation_class->categories  = "compositors:porter-duff";
+  gegl_operation_class_set_keys (operation_class,
+    "name"      , "svg:dst-out",
+    "categories", "compositors:porter-duff",
+    "description",
+        _("Porter Duff operation dst-out (d = cB * (1.0f - aA))"),
+        NULL);
+ 
+
 }
 
 #endif
diff --git a/operations/generated/dst-over.c b/operations/generated/dst-over.c
index 1973999..cf8fa39 100644
--- a/operations/generated/dst-over.c
+++ b/operations/generated/dst-over.c
@@ -109,10 +109,14 @@ gegl_chant_class_init (GeglChantClass *klass)
 
 
   operation_class->compat_name = "gegl:dst-over";
-  operation_class->name        = "svg:dst-over";
-  operation_class->description =
-        _("Porter Duff operation dst-over (d = cB + cA * (1.0f - aB))");
-  operation_class->categories  = "compositors:porter-duff";
+  gegl_operation_class_set_keys (operation_class,
+    "name"      , "svg:dst-over",
+    "categories", "compositors:porter-duff",
+    "description",
+        _("Porter Duff operation dst-over (d = cB + cA * (1.0f - aB))"),
+        NULL);
+ 
+
 }
 
 #endif
diff --git a/operations/generated/dst.c b/operations/generated/dst.c
index b1e5ffe..7fe9f31 100644
--- a/operations/generated/dst.c
+++ b/operations/generated/dst.c
@@ -109,10 +109,14 @@ gegl_chant_class_init (GeglChantClass *klass)
 
 
   operation_class->compat_name = "gegl:dst";
-  operation_class->name        = "svg:dst";
-  operation_class->description =
-        _("Porter Duff operation dst (d = cB)");
-  operation_class->categories  = "compositors:porter-duff";
+  gegl_operation_class_set_keys (operation_class,
+    "name"      , "svg:dst",
+    "categories", "compositors:porter-duff",
+    "description",
+        _("Porter Duff operation dst (d = cB)"),
+        NULL);
+ 
+
 }
 
 #endif
diff --git a/operations/generated/exclusion.c b/operations/generated/exclusion.c
index f527183..5fec960 100644
--- a/operations/generated/exclusion.c
+++ b/operations/generated/exclusion.c
@@ -108,10 +108,13 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->prepare = prepare;
 
   operation_class->compat_name = "gegl:exclusion";
-  operation_class->name        = "svg:exclusion";
-  operation_class->description =
-        _("SVG blend operation exclusion (<tt>d = (cA * aB + cB * aA - 2 * cA * cB) + cA * (1 - aB) + cB * (1 - aA)</tt>)");
-  operation_class->categories  = "compositors:svgfilter";
+  
+  gegl_operation_class_set_keys (operation_class,
+  "name"        , "svg:exclusion",
+  "description" ,
+        _("SVG blend operation exclusion (<tt>d = (cA * aB + cB * aA - 2 * cA * cB) + cA * (1 - aB) + cB * (1 - aA)</tt>)"),
+        NULL);
+  gegl_operation_class_set_key (operation_class, "categories", "compositors:svgfilter");
 }
 
 #endif
diff --git a/operations/generated/gamma.c b/operations/generated/gamma.c
index cfaafcf..64ba54a 100644
--- a/operations/generated/gamma.c
+++ b/operations/generated/gamma.c
@@ -118,9 +118,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   point_composer_class->process = process;
   operation_class->prepare = prepare;
 
-  operation_class->name        = "gegl:gamma";
-  operation_class->categories  = "compositors:math";
-  operation_class->description =
-       _("Math operation gamma (c = powf (c, value))");
+  gegl_operation_class_set_keys (operation_class,
+  "name"        , "gegl:gamma",
+  "categories"  , "compositors:math",
+  "description" ,
+       _("Math operation gamma (c = powf (c, value))"),
+       NULL);
 }
 #endif
diff --git a/operations/generated/hard-light.c b/operations/generated/hard-light.c
index dd9b5f7..da4f595 100644
--- a/operations/generated/hard-light.c
+++ b/operations/generated/hard-light.c
@@ -111,10 +111,12 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->prepare = prepare;
 
   operation_class->compat_name = "gegl:hard-light";
-  operation_class->name        = "svg:hard-light";
-  operation_class->description =
-        _("SVG blend operation hard-light (<tt>if 2 * cA < aA: d = 2 * cA * cB + cA * (1 - aB) + cB * (1 - aA) otherwise: d = aA * aB - 2 * (aB - cB) * (aA - cA) + cA * (1 - aB) + cB * (1 - aA)</tt>)");
-  operation_class->categories  = "compositors:svgfilter";
+  gegl_operation_class_set_keys (operation_class,
+  "name"        , "svg:hard-light",
+  "description" ,
+        _("SVG blend operation hard-light (<tt>if 2 * cA < aA: d = 2 * cA * cB + cA * (1 - aB) + cB * (1 - aA) otherwise: d = aA * aB - 2 * (aB - cB) * (aA - cA) + cA * (1 - aB) + cB * (1 - aA)</tt>)"),
+        NULL);
+  gegl_operation_class_set_key (operation_class, "categories", "compositors:svgfilter");
 }
 
 #endif
diff --git a/operations/generated/lighten.c b/operations/generated/lighten.c
index bff48b3..9720dee 100644
--- a/operations/generated/lighten.c
+++ b/operations/generated/lighten.c
@@ -108,10 +108,13 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->prepare = prepare;
 
   operation_class->compat_name = "gegl:lighten";
-  operation_class->name        = "svg:lighten";
-  operation_class->description =
-        _("SVG blend operation lighten (<tt>d = MAX (cA * aB, cB * aA) + cA * (1 - aB) + cB * (1 - aA)</tt>)");
-  operation_class->categories  = "compositors:svgfilter";
+  
+  gegl_operation_class_set_keys (operation_class,
+  "name"        , "svg:lighten",
+  "description" ,
+        _("SVG blend operation lighten (<tt>d = MAX (cA * aB, cB * aA) + cA * (1 - aB) + cB * (1 - aA)</tt>)"),
+        NULL);
+  gegl_operation_class_set_key (operation_class, "categories", "compositors:svgfilter");
 }
 
 #endif
diff --git a/operations/generated/math.rb b/operations/generated/math.rb
index f1e1043..cbf54fc 100755
--- a/operations/generated/math.rb
+++ b/operations/generated/math.rb
@@ -147,10 +147,12 @@ gegl_chant_class_init (GeglChantClass *klass)
   point_composer_class->process = process;
   operation_class->prepare = prepare;
 
-  operation_class->name        = \"gegl:#{name}\";
-  operation_class->categories  = \"compositors:math\";
-  operation_class->description =
-       _(\"Math operation #{name} (#{formula})\");
+  gegl_operation_class_set_keys (operation_class,
+  \"name\"        , \"gegl:#{name}\",
+  \"categories\"  , \"compositors:math\",
+  \"description\" ,
+       _(\"Math operation #{name} (#{formula})\"),
+       NULL);
 }
 #endif
 "
diff --git a/operations/generated/multiply.c b/operations/generated/multiply.c
index 8b5b239..032c522 100644
--- a/operations/generated/multiply.c
+++ b/operations/generated/multiply.c
@@ -118,9 +118,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   point_composer_class->process = process;
   operation_class->prepare = prepare;
 
-  operation_class->name        = "gegl:multiply";
-  operation_class->categories  = "compositors:math";
-  operation_class->description =
-       _("Math operation multiply (c = c * value)");
+  gegl_operation_class_set_keys (operation_class,
+  "name"        , "gegl:multiply",
+  "categories"  , "compositors:math",
+  "description" ,
+       _("Math operation multiply (c = c * value)"),
+       NULL);
 }
 #endif
diff --git a/operations/generated/other-blend.rb b/operations/generated/other-blend.rb
index a317e2a..5f632bf 100755
--- a/operations/generated/other-blend.rb
+++ b/operations/generated/other-blend.rb
@@ -95,7 +95,7 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->prepare = prepare;
 '
 
-file_tail2 = '  operation_class->categories  = "compositors:porter-duff";
+file_tail2 = '  gegl_operation_class_set_key (operation_class, "categories", "compositors:porter-duff");
 }
 
 #endif
@@ -154,9 +154,13 @@ a.each do
 "
   file.write file_tail1
   file.write "
-  operation_class->name        = \"gegl:#{name}\";
-  operation_class->description =
-        _(\"Porter Duff operation #{name} (d = #{c_formula})\");
+
+  gegl_operation_class_set_keys (operation_class,
+    \"name\"       , \"gegl:#{name}\";
+    \"description\",
+        _(\"Porter Duff operation #{name} (d = #{c_formula})\"),
+        NULL);
+
 "
   file.write file_tail2
   file.close
diff --git a/operations/generated/overlay.c b/operations/generated/overlay.c
index 00bf526..6407f54 100644
--- a/operations/generated/overlay.c
+++ b/operations/generated/overlay.c
@@ -111,10 +111,12 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->prepare = prepare;
 
   operation_class->compat_name = "gegl:overlay";
-  operation_class->name        = "svg:overlay";
-  operation_class->description =
-        _("SVG blend operation overlay (<tt>if 2 * cB > aB: d = 2 * cA * cB + cA * (1 - aB) + cB * (1 - aA) otherwise: d = aA * aB - 2 * (aB - cB) * (aA - cA) + cA * (1 - aB) + cB * (1 - aA)</tt>)");
-  operation_class->categories  = "compositors:svgfilter";
+  gegl_operation_class_set_keys (operation_class,
+  "name"        , "svg:overlay",
+  "description" ,
+        _("SVG blend operation overlay (<tt>if 2 * cB > aB: d = 2 * cA * cB + cA * (1 - aB) + cB * (1 - aA) otherwise: d = aA * aB - 2 * (aB - cB) * (aA - cA) + cA * (1 - aB) + cB * (1 - aA)</tt>)"),
+        NULL);
+  gegl_operation_class_set_key (operation_class, "categories", "compositors:svgfilter");
 }
 
 #endif
diff --git a/operations/generated/plus.c b/operations/generated/plus.c
index 6c7ca18..9850acf 100644
--- a/operations/generated/plus.c
+++ b/operations/generated/plus.c
@@ -107,11 +107,14 @@ gegl_chant_class_init (GeglChantClass *klass)
   point_composer_class->process = process;
   operation_class->prepare = prepare;
 
-  operation_class->name        = "svg:plus";
   operation_class->compat_name = "gegl:plus";
-  operation_class->description =
-        _("SVG blend operation plus (<tt>d = cA + cB</tt>)");
-  operation_class->categories  = "compositors:svgfilter";
+
+  gegl_operation_class_set_keys (operation_class,
+    "name"        , "svg:plus",
+    "description" ,
+    _("SVG blend operation plus (<tt>d = cA + cB</tt>)"),
+    NULL);
+  gegl_operation_class_set_key (operation_class, "categories", "compositors:svgfilter");
 }
 
 #endif
diff --git a/operations/generated/screen.c b/operations/generated/screen.c
index aecf914..5d6b2f0 100644
--- a/operations/generated/screen.c
+++ b/operations/generated/screen.c
@@ -108,10 +108,13 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->prepare = prepare;
 
   operation_class->compat_name = "gegl:screen";
-  operation_class->name        = "svg:screen";
-  operation_class->description =
-        _("SVG blend operation screen (<tt>d = cA + cB - cA * cB</tt>)");
-  operation_class->categories  = "compositors:svgfilter";
+  
+  gegl_operation_class_set_keys (operation_class,
+  "name"        , "svg:screen",
+  "description" ,
+        _("SVG blend operation screen (<tt>d = cA + cB - cA * cB</tt>)"),
+        NULL);
+  gegl_operation_class_set_key (operation_class, "categories", "compositors:svgfilter");
 }
 
 #endif
diff --git a/operations/generated/soft-light.c b/operations/generated/soft-light.c
index 4e087b7..d25e9e0 100644
--- a/operations/generated/soft-light.c
+++ b/operations/generated/soft-light.c
@@ -113,10 +113,12 @@ gegl_chant_class_init (GeglChantClass *klass)
   point_composer_class->process = process;
   operation_class->prepare = prepare;
 
-  operation_class->name        = "gegl:soft-light";
-  operation_class->description =
-        _("SVG blend operation soft-light (<tt>if 2 * cA < aA: d = cB * (aA - (aB == 0 ? 1 : 1 - cB / aB) * (2 * cA - aA)) + cA * (1 - aB) + cB * (1 - aA); if 8 * cB <= aB: d = cB * (aA - (aB == 0 ? 1 : 1 - cB / aB) * (2 * cA - aA) * (aB == 0 ? 3 : 3 - 8 * cB / aB)) + cA * (1 - aB) + cB * (1 - aA); otherwise: d = (aA * cB + (aB == 0 ? 0 : sqrt (cB / aB) * aB - cB) * (2 * cA - aA)) + cA * (1 - aB) + cB * (1 - aA)</tt>)");
-  operation_class->categories  = "compositors:svgfilter";
+  gegl_operation_class_set_keys (operation_class,
+  "name"        , "gegl:soft-light",
+  "description" ,
+        _("SVG blend operation soft-light (<tt>if 2 * cA < aA: d = cB * (aA - (aB == 0 ? 1 : 1 - cB / aB) * (2 * cA - aA)) + cA * (1 - aB) + cB * (1 - aA); if 8 * cB <= aB: d = cB * (aA - (aB == 0 ? 1 : 1 - cB / aB) * (2 * cA - aA) * (aB == 0 ? 3 : 3 - 8 * cB / aB)) + cA * (1 - aB) + cB * (1 - aA); otherwise: d = (aA * cB + (aB == 0 ? 0 : sqrt (cB / aB) * aB - cB) * (2 * cA - aA)) + cA * (1 - aB) + cB * (1 - aA)</tt>)"),
+        NULL);
+  gegl_operation_class_set_key (operation_class, "categories", "compositors:svgfilter");
 }
 
 #endif
diff --git a/operations/generated/src-atop.c b/operations/generated/src-atop.c
index 12278c0..fb10d34 100644
--- a/operations/generated/src-atop.c
+++ b/operations/generated/src-atop.c
@@ -109,10 +109,14 @@ gegl_chant_class_init (GeglChantClass *klass)
 
 
   operation_class->compat_name = "gegl:src-atop";
-  operation_class->name        = "svg:src-atop";
-  operation_class->description =
-        _("Porter Duff operation src-atop (d = cA * aB + cB * (1.0f - aA))");
-  operation_class->categories  = "compositors:porter-duff";
+  gegl_operation_class_set_keys (operation_class,
+    "name"      , "svg:src-atop",
+    "categories", "compositors:porter-duff",
+    "description",
+        _("Porter Duff operation src-atop (d = cA * aB + cB * (1.0f - aA))"),
+        NULL);
+ 
+
 }
 
 #endif
diff --git a/operations/generated/src-in.c b/operations/generated/src-in.c
index ee6ec47..88e5af9 100644
--- a/operations/generated/src-in.c
+++ b/operations/generated/src-in.c
@@ -117,11 +117,15 @@ gegl_chant_class_init (GeglChantClass *klass)
 
 
   operation_class->compat_name = "gegl:src-in";
-  operation_class->name        = "svg:src-in";
-  operation_class->get_bounding_box = get_bounding_box;
-  operation_class->description =
-        _("Porter Duff operation src-in (d = cA * aB)");
-  operation_class->categories  = "compositors:porter-duff";
+  gegl_operation_class_set_keys (operation_class,
+  "name"      , "svg:src-in",
+  "get_bounding_box" , get_bounding_box,
+  "categories", "compositors:porter-duff",
+  "description" ,
+        _("Porter Duff operation src-in (d = cA * aB)"),
+        NULL);
+ 
+
 }
 
 #endif
diff --git a/operations/generated/src-out.c b/operations/generated/src-out.c
index 26a649b..9577f03 100644
--- a/operations/generated/src-out.c
+++ b/operations/generated/src-out.c
@@ -109,10 +109,14 @@ gegl_chant_class_init (GeglChantClass *klass)
 
 
   operation_class->compat_name = "gegl:src-out";
-  operation_class->name        = "svg:src-out";
-  operation_class->description =
-        _("Porter Duff operation src-out (d = cA * (1.0f - aB))");
-  operation_class->categories  = "compositors:porter-duff";
+  gegl_operation_class_set_keys (operation_class,
+    "name"      , "svg:src-out",
+    "categories", "compositors:porter-duff",
+    "description",
+        _("Porter Duff operation src-out (d = cA * (1.0f - aB))"),
+        NULL);
+ 
+
 }
 
 #endif
diff --git a/operations/generated/src-over.c b/operations/generated/src-over.c
index 1bddb16..e586087 100644
--- a/operations/generated/src-over.c
+++ b/operations/generated/src-over.c
@@ -109,10 +109,14 @@ gegl_chant_class_init (GeglChantClass *klass)
 
 
   operation_class->compat_name = "gegl:src-over";
-  operation_class->name        = "svg:src-over";
-  operation_class->description =
-        _("Porter Duff operation src-over (d = cA + cB * (1.0f - aA))");
-  operation_class->categories  = "compositors:porter-duff";
+  gegl_operation_class_set_keys (operation_class,
+    "name"      , "svg:src-over",
+    "categories", "compositors:porter-duff",
+    "description",
+        _("Porter Duff operation src-over (d = cA + cB * (1.0f - aA))"),
+        NULL);
+ 
+
 }
 
 #endif
diff --git a/operations/generated/src.c b/operations/generated/src.c
index 74dfa22..c497d54 100644
--- a/operations/generated/src.c
+++ b/operations/generated/src.c
@@ -109,10 +109,14 @@ gegl_chant_class_init (GeglChantClass *klass)
 
 
   operation_class->compat_name = "gegl:src";
-  operation_class->name        = "svg:src";
-  operation_class->description =
-        _("Porter Duff operation src (d = cA)");
-  operation_class->categories  = "compositors:porter-duff";
+  gegl_operation_class_set_keys (operation_class,
+    "name"      , "svg:src",
+    "categories", "compositors:porter-duff",
+    "description",
+        _("Porter Duff operation src (d = cA)"),
+        NULL);
+ 
+
 }
 
 #endif
diff --git a/operations/generated/subtract.c b/operations/generated/subtract.c
index 43317dc..1779f9a 100644
--- a/operations/generated/subtract.c
+++ b/operations/generated/subtract.c
@@ -118,9 +118,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   point_composer_class->process = process;
   operation_class->prepare = prepare;
 
-  operation_class->name        = "gegl:subtract";
-  operation_class->categories  = "compositors:math";
-  operation_class->description =
-       _("Math operation subtract (c = c - value)");
+  gegl_operation_class_set_keys (operation_class,
+  "name"        , "gegl:subtract",
+  "categories"  , "compositors:math",
+  "description" ,
+       _("Math operation subtract (c = c - value)"),
+       NULL);
 }
 #endif
diff --git a/operations/generated/svg-12-blend.rb b/operations/generated/svg-12-blend.rb
index 0e7680f..66e074c 100755
--- a/operations/generated/svg-12-blend.rb
+++ b/operations/generated/svg-12-blend.rb
@@ -126,7 +126,7 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->prepare = prepare;
 '
 
-file_tail2 = '  operation_class->categories  = "compositors:svgfilter";
+file_tail2 = '  gegl_operation_class_set_key (operation_class, "categories", "compositors:svgfilter");
 }
 
 #endif
@@ -182,9 +182,12 @@ a.each do
   file.write file_tail1
   file.write "
   operation_class->compat_name = \"gegl:#{name}\";
-  operation_class->name        = \"svg:#{name}\";
-  operation_class->description =
-        _(\"SVG blend operation #{name} (<tt>d = #{formula1}</tt>)\");
+  
+  gegl_operation_class_set_keys (operation_class,
+  \"name\"        , \"svg:#{name}\",
+  \"description\" ,
+        _(\"SVG blend operation #{name} (<tt>d = #{formula1}</tt>)\"),
+        NULL);
 "
   file.write file_tail2
   file.close
@@ -245,9 +248,11 @@ b.each do
   file.write file_tail1
   file.write "
   operation_class->compat_name = \"gegl:#{name}\";
-  operation_class->name        = \"svg:#{name}\";
-  operation_class->description =
-        _(\"SVG blend operation #{name} (<tt>if #{cond1}: d = #{formula1} otherwise: d = #{formula2}</tt>)\");
+  gegl_operation_class_set_keys (operation_class,
+  \"name\"        , \"svg:#{name}\",
+  \"description\" ,
+        _(\"SVG blend operation #{name} (<tt>if #{cond1}: d = #{formula1} otherwise: d = #{formula2}</tt>)\"),
+        NULL);
 "
   file.write file_tail2
   file.close
@@ -312,9 +317,11 @@ c.each do
 "
   file.write file_tail1
   file.write "
-  operation_class->name        = \"gegl:#{name}\";
-  operation_class->description =
-        _(\"SVG blend operation #{name} (<tt>if #{cond1}: d = #{formula1}; if #{cond2}: d = #{formula2}; otherwise: d = #{formula3}</tt>)\");
+  gegl_operation_class_set_keys (operation_class,
+  \"name\"        , \"gegl:#{name}\",
+  \"description\" ,
+        _(\"SVG blend operation #{name} (<tt>if #{cond1}: d = #{formula1}; if #{cond2}: d = #{formula2}; otherwise: d = #{formula3}</tt>)\"),
+        NULL);
 "
   file.write file_tail2
   file.close
@@ -370,10 +377,13 @@ d.each do
 "
   file.write file_tail1
   file.write "
-  operation_class->name        = \"svg:#{name}\";
   operation_class->compat_name = \"gegl:#{name}\";
-  operation_class->description =
-        _(\"SVG blend operation #{name} (<tt>d = #{formula1}</tt>)\");
+
+  gegl_operation_class_set_keys (operation_class,
+    \"name\"        , \"svg:#{name}\",
+    \"description\" ,
+    _(\"SVG blend operation #{name} (<tt>d = #{formula1}</tt>)\"),
+    NULL);
 "
   file.write file_tail2
   file.close
diff --git a/operations/generated/svg-12-porter-duff.rb b/operations/generated/svg-12-porter-duff.rb
index 811cfd9..5516802 100755
--- a/operations/generated/svg-12-porter-duff.rb
+++ b/operations/generated/svg-12-porter-duff.rb
@@ -116,7 +116,8 @@ gegl_chant_class_init (GeglChantClass *klass)
 
 '
 
-file_tail2 = '  operation_class->categories  = "compositors:porter-duff";
+file_tail2 = ' 
+
 }
 
 #endif
@@ -175,9 +176,12 @@ a.each do
   file.write file_tail1
   file.write "
   operation_class->compat_name = \"gegl:#{name}\";
-  operation_class->name        = \"svg:#{name}\";
-  operation_class->description =
-        _(\"Porter Duff operation #{name} (d = #{c_formula})\");
+  gegl_operation_class_set_keys (operation_class,
+    \"name\"      , \"svg:#{name}\",
+    \"categories\", \"compositors:porter-duff\",
+    \"description\",
+        _(\"Porter Duff operation #{name} (d = #{c_formula})\"),
+        NULL);
 "
   file.write file_tail2
   file.close
@@ -248,10 +252,13 @@ static GeglRectangle get_bounding_box (GeglOperation *self)
   file.write file_tail1
   file.write "
   operation_class->compat_name = \"gegl:#{name}\";
-  operation_class->name        = \"svg:#{name}\";
-  operation_class->get_bounding_box = get_bounding_box;
-  operation_class->description =
-        _(\"Porter Duff operation #{name} (d = #{c_formula})\");
+  gegl_operation_class_set_keys (operation_class,
+  \"name\"      , \"svg:#{name}\",
+  \"get_bounding_box\" , get_bounding_box,
+  \"categories\", \"compositors:porter-duff\",
+  \"description\" ,
+        _(\"Porter Duff operation #{name} (d = #{c_formula})\"),
+        NULL);
 "
   file.write file_tail2
   file.close
diff --git a/operations/generated/svg-multiply.c b/operations/generated/svg-multiply.c
index 8a47bcf..2c1385c 100644
--- a/operations/generated/svg-multiply.c
+++ b/operations/generated/svg-multiply.c
@@ -107,10 +107,12 @@ gegl_chant_class_init (GeglChantClass *klass)
   point_composer_class->process = process;
   operation_class->prepare = prepare;
 
-  operation_class->name        = "gegl:svg-multiply";
-  operation_class->description =
-        _("SVG blend operation svg-multiply (<tt>d = cA * cB +  cA * (1 - aB) + cB * (1 - aA)</tt>)");
-  operation_class->categories  = "compositors:svgfilter";
+  gegl_operation_class_set_keys (operation_class,
+  "name"       , "gegl:svg-multiply",
+  "categories" , "compositors:svgfilter",
+  "description",
+        _("SVG blend operation svg-multiply (<tt>d = cA * cB +  cA * (1 - aB) + cB * (1 - aA)</tt>)"),
+  NULL);
 }
 
 #endif
diff --git a/operations/generated/xor.c b/operations/generated/xor.c
index 3eaa86c..e35dc0f 100644
--- a/operations/generated/xor.c
+++ b/operations/generated/xor.c
@@ -109,10 +109,14 @@ gegl_chant_class_init (GeglChantClass *klass)
 
 
   operation_class->compat_name = "gegl:xor";
-  operation_class->name        = "svg:xor";
-  operation_class->description =
-        _("Porter Duff operation xor (d = cA * (1.0f - aB)+ cB * (1.0f - aA))");
-  operation_class->categories  = "compositors:porter-duff";
+  gegl_operation_class_set_keys (operation_class,
+    "name"      , "svg:xor",
+    "categories", "compositors:porter-duff",
+    "description",
+        _("Porter Duff operation xor (d = cA * (1.0f - aB)+ cB * (1.0f - aA))"),
+        NULL);
+ 
+
 }
 
 #endif
diff --git a/operations/workshop/box-max.c b/operations/workshop/box-max.c
index 983b431..b395700 100644
--- a/operations/workshop/box-max.c
+++ b/operations/workshop/box-max.c
@@ -191,10 +191,12 @@ gegl_chant_class_init (GeglChantClass *klass)
   filter_class->process = process;
   operation_class->prepare = prepare;
 
-  operation_class->name        = "gegl:box-max";
-  operation_class->categories  = "misc";
-  operation_class->description =
-        _("Sets the target pixel to the value of the maximum value in a box surrounding the pixel.");
+  gegl_operation_class_set_keys (operation_class,
+    "name"        , "gegl:box-max",
+    "categories"  , "misc",
+    "description" ,
+          _("Sets the target pixel to the value of the maximum value in a box surrounding the pixel."),
+          NULL);
 }
 
 #endif
diff --git a/operations/workshop/box-min.c b/operations/workshop/box-min.c
index 86da757..a9cf636 100644
--- a/operations/workshop/box-min.c
+++ b/operations/workshop/box-min.c
@@ -191,10 +191,13 @@ gegl_chant_class_init (GeglChantClass *klass)
   filter_class->process = process;
   operation_class->prepare = prepare;
 
-  operation_class->name        = "gegl:box-min";
-  operation_class->categories  = "misc";
-  operation_class->description =
-        _("Sets the target pixel to the value of the minimum value in a box surrounding the pixel.");
+  gegl_operation_class_set_keys (operation_class,
+  "name"        , "gegl:box-min",
+  "categories"  , "misc",
+  "description" ,
+        _("Sets the target pixel to the value of the minimum value in a box surrounding the pixel."),
+        NULL);
 }
 
+
 #endif
diff --git a/operations/workshop/box-percentile.c b/operations/workshop/box-percentile.c
index ce1ef69..0cc9273 100644
--- a/operations/workshop/box-percentile.c
+++ b/operations/workshop/box-percentile.c
@@ -223,11 +223,13 @@ gegl_chant_class_init (GeglChantClass *klass)
   filter_class->process = process;
   operation_class->prepare = prepare;
 
-  operation_class->name        = "gegl:box-percentile";
-  operation_class->categories  = "misc";
-  operation_class->description =
+  gegl_operation_class_set_keys (operation_class,
+    "name"       , "gegl:box-percentile",
+    "categories" , "misc",
+    "description",
         _("Sets the target pixel to the color corresponding to a given percentile "
-          "when colors are sorted by luminance.");
+          "when colors are sorted by luminance."),
+        NULL);
 }
 
 #endif
diff --git a/operations/workshop/buffer-cache.c b/operations/workshop/buffer-cache.c
index 689c660..324fb5a 100644
--- a/operations/workshop/buffer-cache.c
+++ b/operations/workshop/buffer-cache.c
@@ -97,9 +97,11 @@ gegl_chant_class_init (GeglChantClass *klass)
 
   G_OBJECT_CLASS (klass)->dispose = dispose;
 
-  operation_class->name        = "gegl:buffer-cache";
+  gegl_operation_class_set_keys (operation_class,
+    "name"        , "gegl:buffer-cache",
+    "categories"  , "core",
+    "description" , _("Cache the input buffer internally, further process take this buffer as input."),
+    NULL);
 
-  operation_class->categories  = "core";
-  operation_class->description = _("Cache the input buffer internally, further process take this buffer as input.");
 }
 #endif
diff --git a/operations/workshop/color-reduction.c b/operations/workshop/color-reduction.c
index 6dc61e7..0b62a2a 100644
--- a/operations/workshop/color-reduction.c
+++ b/operations/workshop/color-reduction.c
@@ -452,10 +452,12 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->get_cached_region = get_cached_region;
   filter_class->process = process;
 
-  operation_class->name        = "gegl:color-reduction";
-  operation_class->categories  = "misc";
-  operation_class->description =
-          _("Reduces the number of bits per channel (colors and alpha), with optional dithering.");
+  gegl_operation_class_set_keys (operation_class,
+    "name"        , "gegl:color-reduction",
+    "categories"  , "misc",
+    "description" ,
+            _("Reduces the number of bits per channel (colors and alpha), with optional dithering."),
+            NULL);
 }
 
 #endif
diff --git a/operations/workshop/color-rotate.c b/operations/workshop/color-rotate.c
index 706795c..cf6445d 100644
--- a/operations/workshop/color-rotate.c
+++ b/operations/workshop/color-rotate.c
@@ -379,9 +379,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   filter_class->process    = process;
   operation_class->prepare = prepare;
 
-  operation_class->categories  = "color";
-  operation_class->name        = "gegl:color-rotate";
-  operation_class->description = _("Rotate colors on the image.");
+  gegl_operation_class_set_keys (operation_class,
+    "categories"  , "color",
+    "name"        , "gegl:color-rotate",
+    "description" , _("Rotate colors on the image."),
+    NULL);
 }
 
 #endif
diff --git a/operations/workshop/convolution-matrix.c b/operations/workshop/convolution-matrix.c
index 0cda31f..ef17039 100644
--- a/operations/workshop/convolution-matrix.c
+++ b/operations/workshop/convolution-matrix.c
@@ -426,10 +426,12 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->get_bounding_box        = get_bounding_box;
   operation_class->get_required_for_output = get_required_for_output;
 
-  operation_class->categories  = "generic";
-  operation_class->name        = "gegl:convolution-matrix";
-  operation_class->description =
-    _("Creates image by manually set convolution matrix.");
+  gegl_operation_class_set_keys (operation_class,
+    "categories"  , "generic",
+    "name"        , "gegl:convolution-matrix",
+    "description" ,
+    _("Creates image by manually set convolution matrix."),
+    NULL);
 }
 
 #endif
diff --git a/operations/workshop/cubism.c b/operations/workshop/cubism.c
index 0d90d16..6071f28 100644
--- a/operations/workshop/cubism.c
+++ b/operations/workshop/cubism.c
@@ -589,10 +589,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->get_required_for_output = get_required_for_output;
   operation_class->get_cached_region       = get_cached_region;
 
-  operation_class->categories = "artistic";
-  operation_class->name       = "gegl:cubism";
-  operation_class->description =
-    _("Performs cubism on the image");
+  gegl_operation_class_set_keys (operation_class,
+    "categories", "artistic",
+    "name", "gegl:cubism",
+    "description",  _("Filter that somehow resembels a cubist painting style."),
+    NULL);
 }
 
 #endif
diff --git a/operations/workshop/deinterlace.c b/operations/workshop/deinterlace.c
index c6c42df..5206a13 100644
--- a/operations/workshop/deinterlace.c
+++ b/operations/workshop/deinterlace.c
@@ -303,9 +303,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->get_bounding_box        = get_bounding_box;
   operation_class->get_required_for_output = get_required_for_output;
 
-  operation_class->categories  = "enhance";
-  operation_class->name        = "gegl:deinterlace";
-  operation_class->description = _("Performs deinterlace on the image.");
+  gegl_operation_class_set_keys (operation_class,
+    "categories"  , "enhance",
+    "name"        , "gegl:deinterlace",
+    "description" , _("Performs deinterlace on the image."),
+    NULL);
 }
 
 #endif
diff --git a/operations/workshop/demosaic-bimedian.c b/operations/workshop/demosaic-bimedian.c
index 8b63168..4e91295 100644
--- a/operations/workshop/demosaic-bimedian.c
+++ b/operations/workshop/demosaic-bimedian.c
@@ -213,10 +213,12 @@ gegl_chant_class_init (GeglChantClass *klass)
   filter_class->process    = process;
   operation_class->prepare = prepare;
 
-  operation_class->name        = "gegl:demosaic-bimedian";
-  operation_class->categories  = "blur";
-  operation_class->description =
-        _("Performs a grayscale2color demosaicing of an image, using bimedian interpolation.");
+  gegl_operation_class_set_keys (operation_class,
+    "name"        , "gegl:demosaic-bimedian",
+    "categories"  , "blur",
+    "description" ,
+          _("Performs a grayscale2color demosaicing of an image, using bimedian interpolation."),
+          NULL);
 }
 
 #endif
diff --git a/operations/workshop/demosaic-simple.c b/operations/workshop/demosaic-simple.c
index 1635856..e3a2a00 100644
--- a/operations/workshop/demosaic-simple.c
+++ b/operations/workshop/demosaic-simple.c
@@ -145,9 +145,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   filter_class->process = process;
   operation_class->prepare = prepare;
 
-  operation_class->name        = "gegl:demosaic-simple";
-  operation_class->categories  = "blur";
-  operation_class->description =
-        _("Performs a naive grayscale2color demosaicing of an image, no interpolation.");
+  gegl_operation_class_set_keys (operation_class,
+  "name"        , "gegl:demosaic-simple",
+  "categories"  , "blur",
+  "description" ,
+        _("Performs a naive grayscale2color demosaicing of an image, no interpolation."),
+        NULL);
 }
 #endif
diff --git a/operations/workshop/disc-percentile.c b/operations/workshop/disc-percentile.c
index d2643fd..d9b566d 100644
--- a/operations/workshop/disc-percentile.c
+++ b/operations/workshop/disc-percentile.c
@@ -227,11 +227,13 @@ gegl_chant_class_init (GeglChantClass *klass)
   filter_class->process = process;
   operation_class->prepare = prepare;
 
-  operation_class->name        = "gegl:disc-percentile";
-  operation_class->categories  = "misc";
-  operation_class->description =
+  gegl_operation_class_set_keys (operation_class,
+  "name"        , "gegl:disc-percentile",
+  "categories"  , "misc",
+  "description" ,
         _("Sets the target pixel to the color corresponding to a given"
-          " percentile when colors are sorted by luminance.");
+          " percentile when colors are sorted by luminance."),
+        NULL);
 }
 
 #endif
diff --git a/operations/workshop/ditto.c b/operations/workshop/ditto.c
index 3b2b9cf..9a19df9 100644
--- a/operations/workshop/ditto.c
+++ b/operations/workshop/ditto.c
@@ -105,9 +105,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   filter_class->process    = process;
   operation_class->prepare = prepare;
 
-  operation_class->categories  = "distort";
-  operation_class->name        = "gegl:ditto";
-  operation_class->description = _("Test op to do a 1:1 map of input to output, while sampling");
+  gegl_operation_class_set_keys (operation_class,
+  "categories"  , "distort",
+  "name"        , "gegl:ditto",
+  "description" , _("Test op to do a 1:1 map of input to output, while sampling"),
+  NULL);
 }
 
 #endif
diff --git a/operations/workshop/emboss.c b/operations/workshop/emboss.c
index 12b4f54..7f4d162 100644
--- a/operations/workshop/emboss.c
+++ b/operations/workshop/emboss.c
@@ -242,10 +242,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   filter_class->process    = process;
   operation_class->prepare = prepare;
 
-  operation_class->categories  = "distort";
-  operation_class->name        = "gegl:emboss";
-  operation_class->description =
-    _("Simulates an image created by embossing.");
+  gegl_operation_class_set_keys (operation_class,
+    "categories" , "distort",
+    "name"       , "gegl:emboss",
+    "description", _("Simulates an image created by embossing."),
+    NULL);
 }
 
 #endif
diff --git a/operations/workshop/external/ff-save.c b/operations/workshop/external/ff-save.c
index d550c45..0f3105d 100644
--- a/operations/workshop/external/ff-save.c
+++ b/operations/workshop/external/ff-save.c
@@ -883,9 +883,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   sink_class->process = process;
   sink_class->needs_full = TRUE;
 
-  operation_class->name        = "gegl:ff-save";
-  operation_class->categories  = "output:video";
-  operation_class->description = _("FFmpeg video output sink");
+  gegl_operation_class_set_keys (operation_class,
+    "name"        , "gegl:ff-save",
+    "categories"  , "output:video",
+    "description" , _("FFmpeg video output sink"),
+    NULL);
 }
 
 #endif
diff --git a/operations/workshop/external/gluas.c b/operations/workshop/external/gluas.c
index bc633fd..8ba1101 100644
--- a/operations/workshop/external/gluas.c
+++ b/operations/workshop/external/gluas.c
@@ -977,11 +977,13 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->get_bounding_box = get_bounding_box;
   operation_class->get_required_for_output = get_required_for_output;
 
-  operation_class->name        = "gegl:gluas";
-  operation_class->categories  = "script:misc";
-  operation_class->description =
+  gegl_operation_class_set_keys (operation_class,
+  "name"        , "gegl:gluas",
+  "categories"  , "script:misc",
+  "description" ,
         _("A general purpose filter/composer implementation proxy for the"
-          " lua programming language.");
+          " lua programming language."),
+        NULL);
 }
 
 #endif
diff --git a/operations/workshop/external/lens-correct.c b/operations/workshop/external/lens-correct.c
index ff6d892..79bd0ff 100644
--- a/operations/workshop/external/lens-correct.c
+++ b/operations/workshop/external/lens-correct.c
@@ -469,10 +469,12 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->get_bounding_box = get_bounding_box;
   operation_class->get_required_for_output = get_required_for_output;
 
-  operation_class->name        = "gegl:lens-correct";
-  operation_class->categories  = "blur";
-  operation_class->description =
-    _("Copies image performing lens distortion correction.");
+  gegl_operation_class_set_keys (operation_class,
+   "name"       , "gegl:lens-correct",
+   "categories" , "blur",
+   "description",
+    _("Copies image performing lens distortion correction."),
+    NULL);
 }
 
 #endif
diff --git a/operations/workshop/external/line-profile.c b/operations/workshop/external/line-profile.c
index ae0603a..59d83e6 100644
--- a/operations/workshop/external/line-profile.c
+++ b/operations/workshop/external/line-profile.c
@@ -171,12 +171,14 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->get_required_for_output = get_required_for_output;
   operation_class->get_bounding_box = get_bounding_box;
 
-  operation_class->name        = "gegl:line-profile";
-  operation_class->categories  = "debug";
-  operation_class->description =
-        _("Renders luminance profiles for red green and blue components along"
-          " the specified line in the input buffer, plotted in a buffer of the"
-          " specified size.");
+  gegl_operation_class_set_keys (operation_class,
+    "name"        , "gegl:line-profile",
+    "categories"  , "debug",
+    "description" ,
+          _("Renders luminance profiles for red green and blue components along"
+            " the specified line in the input buffer, plotted in a buffer of the"
+            " specified size."),
+          NULL);
 }
 
 #endif
diff --git a/operations/workshop/fractal-trace.c b/operations/workshop/fractal-trace.c
index 1184f32..f864bad 100644
--- a/operations/workshop/fractal-trace.c
+++ b/operations/workshop/fractal-trace.c
@@ -315,9 +315,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->get_bounding_box        = get_bounding_box;
   operation_class->get_required_for_output = get_required_for_output;
 
-  operation_class->categories  = "map";
-  operation_class->name        = "gegl:fractal-trace";
-  operation_class->description = _("Performs fractal trace on the image");
+  gegl_operation_class_set_keys (operation_class,
+    "categories"  , "map",
+    "name"        , "gegl:fractal-trace",
+    "description" , _("Performs fractal trace on the image"),
+    NULL);
 }
 
 #endif
diff --git a/operations/workshop/generated/average.c b/operations/workshop/generated/average.c
index 7606d28..5849326 100644
--- a/operations/workshop/generated/average.c
+++ b/operations/workshop/generated/average.c
@@ -102,10 +102,12 @@ gegl_chant_class_init (GeglChantClass *klass)
   point_composer_class->process = process;
   operation_class->prepare = prepare;
 
-  operation_class->name        = "gegl:average";
-  operation_class->categories  = "compositors:blend";
-  operation_class->description =
-        _("Image blending operation 'average' (<tt>c = (cA + aB)/2</tt>)");
+  gegl_operation_class_set_keys (operation_class,
+  "name"        , "gegl:average",
+  "categories"  , "compositors:blend",
+  "description" ,
+        _("Image blending operation 'average' (<tt>c = (cA + aB)/2</tt>)"),
+        NULL);
 }
 
 #endif
diff --git a/operations/workshop/generated/blend-reflect.c b/operations/workshop/generated/blend-reflect.c
index c1d3bbc..c10803f 100644
--- a/operations/workshop/generated/blend-reflect.c
+++ b/operations/workshop/generated/blend-reflect.c
@@ -102,10 +102,12 @@ gegl_chant_class_init (GeglChantClass *klass)
   point_composer_class->process = process;
   operation_class->prepare = prepare;
 
-  operation_class->name        = "gegl:blend-reflect";
-  operation_class->categories  = "compositors:blend";
-  operation_class->description =
-        _("Image blending operation 'blend-reflect' (<tt>c = cB>=1.0?1.0:cA*cA / (1.0-cB)</tt>)");
+  gegl_operation_class_set_keys (operation_class,
+  "name"        , "gegl:blend-reflect",
+  "categories"  , "compositors:blend",
+  "description" ,
+        _("Image blending operation 'blend-reflect' (<tt>c = cB>=1.0?1.0:cA*cA / (1.0-cB)</tt>)"),
+        NULL);
 }
 
 #endif
diff --git a/operations/workshop/generated/blend.rb b/operations/workshop/generated/blend.rb
index dcda16b..5ece5cf 100755
--- a/operations/workshop/generated/blend.rb
+++ b/operations/workshop/generated/blend.rb
@@ -140,10 +140,12 @@ gegl_chant_class_init (GeglChantClass *klass)
   point_composer_class->process = process;
   operation_class->prepare = prepare;
 
-  operation_class->name        = \"gegl:#{name}\";
-  operation_class->categories  = \"compositors:blend\";
-  operation_class->description =
-        _(\"Image blending operation '#{name}' (<tt>c = #{formula}</tt>)\");
+  gegl_operation_class_set_keys (operation_class,
+  \"name\"        , \"gegl:#{name}\",
+  \"categories\"  , \"compositors:blend\",
+  \"description\" ,
+        _(\"Image blending operation '#{name}' (<tt>c = #{formula}</tt>)\"),
+        NULL);
 }
 
 #endif
diff --git a/operations/workshop/generated/negation.c b/operations/workshop/generated/negation.c
index 6ea2283..b66fd03 100644
--- a/operations/workshop/generated/negation.c
+++ b/operations/workshop/generated/negation.c
@@ -102,10 +102,12 @@ gegl_chant_class_init (GeglChantClass *klass)
   point_composer_class->process = process;
   operation_class->prepare = prepare;
 
-  operation_class->name        = "gegl:negation";
-  operation_class->categories  = "compositors:blend";
-  operation_class->description =
-        _("Image blending operation 'negation' (<tt>c = 1.0 - fabs(1.0-cA-cB)</tt>)");
+  gegl_operation_class_set_keys (operation_class,
+  "name"        , "gegl:negation",
+  "categories"  , "compositors:blend",
+  "description" ,
+        _("Image blending operation 'negation' (<tt>c = 1.0 - fabs(1.0-cA-cB)</tt>)"),
+        NULL);
 }
 
 #endif
diff --git a/operations/workshop/generated/soft-burn.c b/operations/workshop/generated/soft-burn.c
index ffcc0f9..9c57d70 100644
--- a/operations/workshop/generated/soft-burn.c
+++ b/operations/workshop/generated/soft-burn.c
@@ -102,10 +102,12 @@ gegl_chant_class_init (GeglChantClass *klass)
   point_composer_class->process = process;
   operation_class->prepare = prepare;
 
-  operation_class->name        = "gegl:soft-burn";
-  operation_class->categories  = "compositors:blend";
-  operation_class->description =
-        _("Image blending operation 'soft-burn' (<tt>c = (cA+cB<1.0)?0.5*cB / (1.0 - cA):1.0-0.5*(1.0 - cA) / cB</tt>)");
+  gegl_operation_class_set_keys (operation_class,
+  "name"        , "gegl:soft-burn",
+  "categories"  , "compositors:blend",
+  "description" ,
+        _("Image blending operation 'soft-burn' (<tt>c = (cA+cB<1.0)?0.5*cB / (1.0 - cA):1.0-0.5*(1.0 - cA) / cB</tt>)"),
+        NULL);
 }
 
 #endif
diff --git a/operations/workshop/generated/soft-dodge.c b/operations/workshop/generated/soft-dodge.c
index 6e2cf4f..1e594fa 100644
--- a/operations/workshop/generated/soft-dodge.c
+++ b/operations/workshop/generated/soft-dodge.c
@@ -102,10 +102,12 @@ gegl_chant_class_init (GeglChantClass *klass)
   point_composer_class->process = process;
   operation_class->prepare = prepare;
 
-  operation_class->name        = "gegl:soft-dodge";
-  operation_class->categories  = "compositors:blend";
-  operation_class->description =
-        _("Image blending operation 'soft-dodge' (<tt>c = (cA+cB<1.0)?0.5*cA / (1.0 - cB):1.0-0.5*(1.0 - cB)/cA</tt>)");
+  gegl_operation_class_set_keys (operation_class,
+  "name"        , "gegl:soft-dodge",
+  "categories"  , "compositors:blend",
+  "description" ,
+        _("Image blending operation 'soft-dodge' (<tt>c = (cA+cB<1.0)?0.5*cA / (1.0 - cB):1.0-0.5*(1.0 - cB)/cA</tt>)"),
+        NULL);
 }
 
 #endif
diff --git a/operations/workshop/generated/subtractive.c b/operations/workshop/generated/subtractive.c
index 1fd0a9b..b5c8bae 100644
--- a/operations/workshop/generated/subtractive.c
+++ b/operations/workshop/generated/subtractive.c
@@ -102,10 +102,12 @@ gegl_chant_class_init (GeglChantClass *klass)
   point_composer_class->process = process;
   operation_class->prepare = prepare;
 
-  operation_class->name        = "gegl:subtractive";
-  operation_class->categories  = "compositors:blend";
-  operation_class->description =
-        _("Image blending operation 'subtractive' (<tt>c = cA+cB-1.0</tt>)");
+  gegl_operation_class_set_keys (operation_class,
+  "name"        , "gegl:subtractive",
+  "categories"  , "compositors:blend",
+  "description" ,
+        _("Image blending operation 'subtractive' (<tt>c = cA+cB-1.0</tt>)"),
+        NULL);
 }
 
 #endif
diff --git a/operations/workshop/hstack.c b/operations/workshop/hstack.c
index d62b2d2..3ba5bd5 100644
--- a/operations/workshop/hstack.c
+++ b/operations/workshop/hstack.c
@@ -171,10 +171,12 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->get_invalidated_by_change = get_invalidated_by_change;
   operation_class->get_required_for_output = get_required_for_output;
 
-  operation_class->name        = "gegl:hstack";
-  operation_class->categories  = "misc";
-  operation_class->description =
-        _("Horizontally stack inputs, (in \"output\" \"aux\" is placed to the right of \"input\")");
+  gegl_operation_class_set_keys (operation_class,
+  "name"        , "gegl:hstack",
+  "categories"  , "misc",
+  "description" ,
+        _("Horizontally stack inputs, (in \"output\" \"aux\" is placed to the right of \"input\")"),
+        NULL);
 }
 
 #endif
diff --git a/operations/workshop/kuwahara.c b/operations/workshop/kuwahara.c
index 42d8eec..e5f30da 100644
--- a/operations/workshop/kuwahara.c
+++ b/operations/workshop/kuwahara.c
@@ -237,9 +237,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   filter_class->process = process;
   operation_class->prepare = prepare;
 
-  operation_class->name        = "gegl:kuwahara";
-  operation_class->categories  = "misc";
-  operation_class->description = _("Edge preserving blur");
+  gegl_operation_class_set_keys (operation_class,
+    "name"    , "gegl:kuwahara",
+    "categories"  , "misc",
+    "description" , _("Edge preserving blur"),
+    NULL);
 }
 
 #endif
diff --git a/operations/workshop/lens-distortion.c b/operations/workshop/lens-distortion.c
index 377a43c..ccceeed 100644
--- a/operations/workshop/lens-distortion.c
+++ b/operations/workshop/lens-distortion.c
@@ -315,10 +315,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->get_bounding_box = get_bounding_box;
   operation_class->get_required_for_output = get_required_for_output;
 
-  operation_class->name        = "gegl:lens-distortion";
-  operation_class->categories  = "blur";
-  operation_class->description =
-    _("Copies image performing lens distortion correction.");
+  gegl_operation_class_set_keys (operation_class,
+    "name"       , "gegl:lens-distortion",
+    "categories" , "blur",
+    "description", _("Copies image performing lens distortion correction."),
+    NULL);
 }
 
 #endif
diff --git a/operations/workshop/linear-gradient.c b/operations/workshop/linear-gradient.c
index 6bc289d..b7b5c87 100644
--- a/operations/workshop/linear-gradient.c
+++ b/operations/workshop/linear-gradient.c
@@ -131,9 +131,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->prepare = prepare;
   operation_class->no_cache = TRUE;
 
-  operation_class->name        = "gegl:linear-gradient";
-  operation_class->categories  = "render";
-  operation_class->description = _("linear gradient renderer");
+  gegl_operation_class_set_keys (operation_class,
+    "name"        , "gegl:linear-gradient",
+    "categories"  , "render",
+    "description" , _("linear gradient renderer"),
+    NULL);
 }
 
 #endif
diff --git a/operations/workshop/mandelbrot.c b/operations/workshop/mandelbrot.c
index 7d8e99d..20d464d 100644
--- a/operations/workshop/mandelbrot.c
+++ b/operations/workshop/mandelbrot.c
@@ -138,9 +138,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->prepare = prepare;
   operation_class->get_bounding_box = get_bounding_box;
 
-  operation_class->name        = "gegl:mandelbrot";
-  operation_class->categories  = "render";
-  operation_class->description = _("Mandelbrot set renderer.");
+  gegl_operation_class_set_keys (operation_class,
+    "name"        , "gegl:mandelbrot",
+    "categories"  , "render",
+    "description" , _("Mandelbrot set renderer."),
+    NULL);
 }
 
 #endif
diff --git a/operations/workshop/max-rgb.c b/operations/workshop/max-rgb.c
index 802cbec..2cfc92e 100644
--- a/operations/workshop/max-rgb.c
+++ b/operations/workshop/max-rgb.c
@@ -114,9 +114,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->prepare = prepare;
   point_filter_class->process = process;
 
-  operation_class->name        = "gegl:max-rgb";
-  operation_class->categories  = "color";
-  operation_class->description = _("Reduce image to pure red, green, and blue");
+  gegl_operation_class_set_keys (operation_class,
+    "name"        , "gegl:max-rgb",
+    "categories"  , "color",
+    "description" , _("Reduce image to pure red, green, and blue"),
+    NULL);
 }
 
 #endif
diff --git a/operations/workshop/radial-gradient.c b/operations/workshop/radial-gradient.c
index 5713836..b940de2 100644
--- a/operations/workshop/radial-gradient.c
+++ b/operations/workshop/radial-gradient.c
@@ -123,9 +123,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->prepare = prepare;
   operation_class->no_cache = TRUE;
 
-  operation_class->name        = "gegl:radial-gradient";
-  operation_class->categories  = "render";
-  operation_class->description = _("radial gradient renderer");
+  gegl_operation_class_set_keys (operation_class,
+    "name"        , "gegl:radial-gradient",
+    "categories"  , "render",
+    "description" , _("radial gradient renderer"),
+    NULL);
 }
 
 #endif
diff --git a/operations/workshop/rawbayer-load.c b/operations/workshop/rawbayer-load.c
index 07b542e..543051c 100644
--- a/operations/workshop/rawbayer-load.c
+++ b/operations/workshop/rawbayer-load.c
@@ -147,14 +147,16 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->process = process;
   operation_class->get_bounding_box = get_bounding_box;
 
-  operation_class->name        = "gegl:rawbayer-load";
-  operation_class->categories  = "hidden";
-  operation_class->description =
+  gegl_operation_class_set_keys (operation_class,
+  "name"        , "gegl:rawbayer-load",
+  "categories"  , "hidden",
+  "description" ,
         _("Raw image loader, wrapping dcraw with pipes, provides the raw bayer"
           " grid as grayscale, if the fileformat is .rawbayer it will use this"
           " loader instead of the normal dcraw loader, if the fileformat is"
           " .rawbayerS it will swap the returned 16bit numbers (the pnm loader"
-          " is apparently buggy)");
+          " is apparently buggy)"),
+        NULL);
 
   gegl_extension_handler_register (".rawbayer", "gegl:rawbayer-load");
   gegl_extension_handler_register (".rawbayerS", "gegl:rawbayer-load");
diff --git a/operations/workshop/red-eye-removal.c b/operations/workshop/red-eye-removal.c
index 1f645f8..b197157 100644
--- a/operations/workshop/red-eye-removal.c
+++ b/operations/workshop/red-eye-removal.c
@@ -126,9 +126,11 @@ gegl_chant_class_init (GeglChantClass *klass)
   filter_class->process    = process;
   operation_class->prepare = prepare;
 
-  operation_class->categories  = "enhance";
-  operation_class->name        = "gegl:red-eye-removal";
-  operation_class->description = _("Performs red-eye-removal on the image.");
+  gegl_operation_class_set_keys (operation_class,
+    "categories"  , "enhance",
+    "name"        , "gegl:red-eye-removal",
+    "description" , _("Performs red-eye-removal on the image."),
+    NULL);
 }
 
 #endif
diff --git a/operations/workshop/snn-percentile.c b/operations/workshop/snn-percentile.c
index 6c7b4d5..d45decb 100644
--- a/operations/workshop/snn-percentile.c
+++ b/operations/workshop/snn-percentile.c
@@ -265,10 +265,12 @@ gegl_chant_class_init (GeglChantClass *klass)
   filter_class->process = process;
   operation_class->prepare = prepare;
 
-  operation_class->name        = "gegl:snn-percentile";
-  operation_class->categories  = "misc";
-  operation_class->description =
-        _("Noise reducing edge enhancing percentile filter based on Symmetric Nearest Neighbours");
+  gegl_operation_class_set_keys (operation_class,
+  "name"        , "gegl:snn-percentile",
+  "categories"  , "misc",
+  "description" ,
+        _("Noise reducing edge enhancing percentile filter based on Symmetric Nearest Neighbours"),
+        NULL);
 }
 
 #endif
diff --git a/operations/workshop/unpremul.c b/operations/workshop/unpremul.c
index e463286..5731af2 100644
--- a/operations/workshop/unpremul.c
+++ b/operations/workshop/unpremul.c
@@ -69,9 +69,11 @@ gegl_chant_class_init (GeglChantClass *klass)
 
   point_filter_class->process = process;
 
-  operation_class->name        = "gegl:unpremul";
-  operation_class->categories  = "color";
-  operation_class->description = "Unpremultiplies a buffer that contains pre-multiplied colors (but is marked as not having it)";
+  gegl_operation_class_set_keys (operation_class,
+    "name"        , "gegl:unpremul",
+    "categories"  , "color",
+    "description" , "Unpremultiplies a buffer that contains pre-multiplied colors (but is marked as not having it)",
+    NULL);
 }
 
 #endif
diff --git a/operations/workshop/warp.c b/operations/workshop/warp.c
index b150e58..b039890 100644
--- a/operations/workshop/warp.c
+++ b/operations/workshop/warp.c
@@ -373,8 +373,10 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->prepare = prepare;
   filter_class->process = process;
 
-  operation_class->name        = "gegl:warp";
-  operation_class->categories  = "transform";
-  operation_class->description = _("Compute a relative displacement mapping from a stroke");
+  gegl_operation_class_set_keys (operation_class,
+  "name"       , "gegl:warp",
+  "categories"  , "transform",
+  "description" , _("Compute a relative displacement mapping from a stroke"),
+  NULL);
 }
 #endif
diff --git a/operations/workshop/whirl-pinch.c b/operations/workshop/whirl-pinch.c
index 19b2cb1..0a901eb 100644
--- a/operations/workshop/whirl-pinch.c
+++ b/operations/workshop/whirl-pinch.c
@@ -251,10 +251,12 @@ gegl_chant_class_init (GeglChantClass *klass)
   operation_class->get_bounding_box = get_bounding_box;
   operation_class->get_required_for_output = get_required_for_output;
 
-  operation_class->name        = "gegl:whirl-pinch";
-  operation_class->categories  = "distort";
-  operation_class->description =
-        _("Applies whirling and pinching on the image");
+  gegl_operation_class_set_keys (operation_class,
+  "name"        , "gegl:whirl-pinch",
+  "categories"  , "distort",
+  "description" ,
+        _("Applies whirling and pinching on the image"),
+        NULL);
 }
 
 #endif
diff --git a/tools/operation_reference.c b/tools/operation_reference.c
index 0761138..848fbec 100644
--- a/tools/operation_reference.c
+++ b/tools/operation_reference.c
@@ -259,7 +259,8 @@ static void category_index (gpointer key,
   for (iter=operations, comma=FALSE;iter;iter = g_list_next (iter))
     {
       GeglOperationClass *klass = iter->data;
-      if (strstr (klass->categories, "hidden"))
+      const char *categories = gegl_operation_class_get_key (klass, "categories");
+      if (strstr (categories, "hidden"))
         continue;
       g_print ("%s<a href='#op_%s'>%s</a>\n", comma?"":"", klass->name, klass->name);
       comma = TRUE;
@@ -280,7 +281,8 @@ static void category_menu_index (gpointer key,
   for (iter=operations;iter;iter = g_list_next (iter))
     {
       GeglOperationClass *klass = iter->data;
-      if (strstr (klass->categories, "hidden"))
+      const char *categories = gegl_operation_class_get_key (klass, "categories");
+      if (!categories || strstr (categories, "hidden"))
         continue;
       g_print ("<li><a href='#op_%s'>%s</a></li>\n", klass->name, klass->name);
     }
@@ -303,8 +305,9 @@ main (gint    argc,
   for (iter=operations;iter;iter = g_list_next (iter))
     {
       GeglOperationClass *klass = iter->data;
-      const gchar *ptr = klass->categories;
-      while (*ptr)
+      const char *categoris = gegl_operation_class_get_key (klass, "categories");
+      const gchar *ptr = categoris;
+      while (ptr && *ptr)
         {
           gchar category[64]="";
           gint i=0;
@@ -358,12 +361,14 @@ main (gint    argc,
   for (iter=operations;iter;iter = g_list_next (iter))
     {
       GeglOperationClass *klass = iter->data;
-      if (strstr (klass->categories, "hidden"))
+      const char *categoris = gegl_operation_class_get_key (klass, "categories");
+      const char *description = gegl_operation_class_get_key (klass, "description");
+      if (categoris && strstr (categoris, "hidden"))
         continue;
 
       g_print ("<tr>\n  <td colspan='1'>&nbsp;</td>\n  <td class='op_name' colspan='4'><a name='op_%s'>%s</a></td>\n</tr>\n", klass->name, klass->name);
-      if (klass->description)
-        g_print ("<tr>\n  <td colspan='1'>&nbsp;</td>\n  <td class='op_description' colspan='4'>%s</td>\n</tr>\n", klass->description);
+      if (description)
+        g_print ("<tr>\n  <td colspan='1'>&nbsp;</td>\n  <td class='op_description' colspan='4'>%s</td>\n</tr>\n", description);
       list_properties (G_OBJECT_CLASS_TYPE (klass), 2, TRUE);
     }
   g_print ("</table>\n");



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]