+ programming_error ("Ligature_engraver::create_ligature_spanner (): "
+ "this is an abstract method that should not be called, "
+ "but overridden by a subclass");
+ return 0;
+}
+
+/*
+ * This method should do something that comes close to the following
+ * .ly snippet:
+ *
+ * \property Voice.NoteHead \override #'print-function =
+ * < value of #'ligature-primitive-callback of Voice.NoteHead >
+ *
+ * TODO: What we are doing here on the c++ level, should actually be
+ * performed on the SCM level. However, I do not know how to teach
+ * lilypond to apply an \override and \revert on #'print-function,
+ * whenever lily encounters a \[ and \] in an .ly file, respectively.
+ * Also encounter, that lily should not crash if a user erronously
+ * nests \[ and \].
+ */
+void
+Ligature_engraver::override_stencil_callback ()
+{
+ SCM target_callback = ly_symbol2scm ("print-function");
+ SCM source_callback = ly_symbol2scm ("ligature-primitive-callback");
+ SCM noteHeadProperties = updated_grob_properties (context (), ly_symbol2scm ("NoteHead"));
+ SCM value = scm_cdr (scm_sloppy_assq (source_callback, noteHeadProperties));
+ execute_pushpop_property (context (), ly_symbol2scm ("NoteHead"),
+ target_callback, value);
+}
+
+/*
+ * This method should do something that comes close to the following
+ * .ly snippet:
+ *
+ * \property Voice.NoteHead \revert #'print-function
+ *
+ * TODO: What we are doing here on the c++ level, should actually be
+ * performed on the SCM level. However, I do not know how to teach
+ * lilypond to apply an \override and \revert on #'print-function,
+ * whenever lily encounters a \[ and \] in an .ly file, respectively.
+ * Also encounter, that lily should not crash if a user erronously
+ * nests \[ and \].
+ */
+void
+Ligature_engraver::revert_stencil_callback ()
+{
+ SCM symbol = ly_symbol2scm ("NoteHead");
+ SCM key = ly_symbol2scm ("print-function");
+ execute_pushpop_property (context (), symbol, key, SCM_UNDEFINED);