added value_type metaprogram with tests