Derek,
I suggest you take a different look at what the objects are. Perhaps a BillOfMaterials object would be a better thought.
Such an object could have a property for the itemid of the finished good you want the BOM for, and it could have a method that is recursive to find all the components of that good. So, when you want the BOM for a Widget (ItemID 123) you just;
oBOM.ItemID = 123
oBOM.Explode()
and the object will produce the BOM for you. You could store the BOM in a cursor or table or anything else. Then use that for printing or viewing.