/* vim: set filetype=c: */
% ClassName
GstObject
% TYPE_CLASS_NAME
GST_TYPE_OBJECT
% includes
% prototypes

static void gst_replace_set_property (GObject * object,
    guint property_id, const GValue * value, GParamSpec * pspec);
static void gst_replace_get_property (GObject * object,
    guint property_id, GValue * value, GParamSpec * pspec);
static void gst_replace_dispose (GObject * object);
static void gst_replace_finalize (GObject * object);

% declare-class
  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
% set-methods
  gobject_class->set_property = gst_replace_set_property;
  gobject_class->get_property = gst_replace_get_property;
  gobject_class->dispose = gst_replace_dispose;
  gobject_class->finalize = gst_replace_finalize;
% methods

void
gst_replace_set_property (GObject * object, guint property_id,
    const GValue * value, GParamSpec * pspec)
{
  /* GstReplace *replace = GST_REPLACE (object); */

  switch (property_id) {
    default:
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
      break;
  }
}

void
gst_replace_get_property (GObject * object, guint property_id,
    GValue * value, GParamSpec * pspec)
{
  /* GstReplace *replace = GST_REPLACE (object); */

  switch (property_id) {
    default:
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
      break;
  }
}

void
gst_replace_dispose (GObject * object)
{
  /* GstReplace *replace = GST_REPLACE (object); */

  /* clean up as possible.  may be called multiple times */

  G_OBJECT_CLASS (gst_replace_parent_class)->dispose (object);
}

void
gst_replace_finalize (GObject * object)
{
  /* GstReplace *replace = GST_REPLACE (object); */

  /* clean up object here */

  G_OBJECT_CLASS (gst_replace_parent_class)->finalize (object);
}

% end

