model: rather than listeners, just have one 'onContentsChanged' function
model: extract item population to separate function
model: extract item model into separate class
model: remove unused function
model: shift classification about a bit, because reasons