ModuleItem: move getSoftMin/Max to abstract layer

The default behavior is just fine for 99+% of ModuleItem extensions, so
let's provide the default behavior in the abstract superclass instead of
forcing every concrete extension to implement these two methods.