Sure. If there's a suitable discriminator column, this isn't too hard to do. There is some ugliness because the discriminator values get hardcoded into your mapping file a couple of times..
ProductImpl gets two subclasses, AddonImpl and WarrantyImpl. Assuming that the discriminator column is "ProductTypeID" and has values 'p', 'a' and 'w', the Product mapping gets two bags:
Code:
<bag name="Addons" where="ProductTypeID='a'">
<key column="MainProductID" not-null="true"/>
<one-to-many class="AddonImpl"/>
</bag>
<bag name="Warranties" where="ProductTypeID='w'">
<key column="WarrantiedProductID" not-null="true"/>
<one-to-many class="WarrantyImpl"/>
</bag>
You should write an event handler or at least a product-validation method that ensures that the user hasn't put any warranties into the addons bag, etc.