Implement ``custom_model_2d``

Since we have ``custom_model_1d``, is there any reason we can't have ``custom_model_2d``?
(Minor) This should be ``six.callable``