/* 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);

  GST_DEBUG_OBJECT (replace, "set_property");

  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);

  GST_DEBUG_OBJECT (replace, "get_property");

  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);

  GST_DEBUG_OBJECT (replace, "dispose");

  /* 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);

  GST_DEBUG_OBJECT (replace, "finalize");

  /* clean up object here */

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

% end

