+LY_DEFINE (ly_grob_properties, "ly:grob-properties",
+ 1, 0, 0, (SCM grob),
+ "Get the mutable properties of @var{grob}.")
+{
+ Grob *g = unsmob_grob (grob);
+
+ LY_ASSERT_SMOB (Grob, grob, 1);
+
+ /* FIXME: uhg? copy/read only? */
+ return g->mutable_property_alist_;
+}
+
+LY_DEFINE (ly_grob_basic_properties, "ly:grob-basic-properties",
+ 1, 0, 0, (SCM grob),
+ "Get the immutable properties of @var{grob}.")
+{
+ Grob *g = unsmob_grob (grob);
+
+ LY_ASSERT_SMOB (Grob, grob, 1);
+
+ /* FIXME: uhg? copy/read only? */
+ return g->immutable_property_alist_;
+}
+
+LY_DEFINE (ly_grob_system, "ly:grob-system",
+ 1, 0, 0, (SCM grob),
+ "Return the system grob of @var{grob}.")
+{
+ Grob *me = unsmob_grob (grob);
+
+ LY_ASSERT_SMOB (Grob, grob, 1);
+
+ if (System *g = me->get_system ())
+ return g->self_scm ();
+
+ return SCM_EOL;
+}
+
+LY_DEFINE (ly_grob_original, "ly:grob-original",
+ 1, 0, 0, (SCM grob),
+ "Return the unbroken original grob of @var{grob}.")
+{
+ Grob *me = unsmob_grob (grob);
+
+ LY_ASSERT_SMOB (Grob, grob, 1);
+ return me->original () ? me->original ()->self_scm () : me->self_scm ();
+}
+
+
+LY_DEFINE (ly_grob_suicide_x, "ly:grob-suicide!",
+ 1, 0, 0, (SCM grob),
+ "Kill @var{grob}.")
+{
+ Grob *me = unsmob_grob (grob);
+
+ LY_ASSERT_SMOB (Grob, grob, 1);
+
+ me->suicide ();
+ return SCM_UNSPECIFIED;
+}
+
+LY_DEFINE (ly_grob_translate_axis_x, "ly:grob-translate-axis!",
+ 3, 0, 0, (SCM grob, SCM d, SCM a),
+ "Translate @var{g} on axis@tie{}@var{a} over"
+ " distance@tie{}@var{d}.")
+{
+ Grob *me = unsmob_grob (grob);
+
+ LY_ASSERT_SMOB (Grob, grob, 1);
+ LY_ASSERT_TYPE (scm_is_number, d, 2);
+ LY_ASSERT_TYPE (is_axis, a, 3);
+
+ me->translate_axis (scm_to_double (d), Axis (scm_to_int (a)));
+ return SCM_UNSPECIFIED;