+#include "paper-column.hh"
+#include "spanner.hh"
+#include "lily-guile.hh"
+#include "system.hh"
+#include "group-interface.hh"
+
+Item::Item (SCM s)
+ : Grob (s)
+{
+ broken_to_drul_[LEFT] = broken_to_drul_[RIGHT]=0;
+ Group_interface::add_thing (this, ly_symbol2scm ("interfaces"), ly_symbol2scm ("item-interface"));
+
+}
+
+/**
+ Item copy ctor. Copy nothing: everything should be a elt property
+ or a special purpose pointer (such as broken_to_drul_[]) */
+Item::Item (Item const &s)
+ : Grob (s)
+{
+ broken_to_drul_[LEFT] = broken_to_drul_[RIGHT] =0;
+}
+
+
+bool
+Item::breakable_b (Grob*me)
+{
+ if (me->original_l_)
+ return false;
+
+ if (!dynamic_cast<Item*> (me))
+ programming_error ("only items can be breakable.");
+
+ Item * i =dynamic_cast<Item*> (me->get_parent (X_AXIS));
+ return (i) ? Item::breakable_b (i) : to_boolean (me->get_grob_property ("breakable"));
+}
+
+Paper_column *
+Item::column_l () const
+{
+ Item *parent = dynamic_cast<Item*> (get_parent (X_AXIS));
+ return parent ? parent->column_l () : 0;
+}
+
+System *
+Item::line_l () const
+{
+ Grob *g = get_parent (X_AXIS);
+ return g ? g->line_l () : 0;
+}
+
+
+void
+Item::copy_breakable_items ()
+{
+ Drul_array<Item *> new_copies;
+ Direction i=LEFT;
+ do
+ {
+ Grob * dolly = clone ();
+ Item * item_p = dynamic_cast<Item*> (dolly);
+ pscore_l_->line_l_->typeset_grob (item_p);
+ new_copies[i] =item_p;
+ }
+ while (flip (&i) != LEFT);
+ broken_to_drul_= new_copies;
+}
+