/**
 * Displays meta box fields with current or default values.
 * */
function display_meta_box_field($post_id, $field)
{
    $field_obj = null;
    $field['value'] = get_post_meta($post_id, $field['id'], true);
    // Fix inconsistencies between CPT field array keys and Field obj property names
    // TODO update CPT field array keys to match Field obj property names
    if (isset($field['desc'])) {
        $field['description'] = $field['desc'];
        unset($field['desc']);
    }
    if (isset($field['options'])) {
        $field['choices'] = $field['options'];
        unset($field['options']);
    }
    switch ($field['type']) {
        case 'text':
            $field_obj = new TextField($field);
            break;
        case 'textarea':
            $field_obj = new TextareaField($field);
            break;
        case 'select':
            $field_obj = new SelectField($field);
            break;
        case 'multiselect':
            $field_obj = new MultiselectField($field);
            break;
        case 'radio':
            $field_obj = new RadioField($field);
            break;
        case 'checkbox':
            $field_obj = new CheckboxField($field);
            break;
        case 'file':
            $field['post_id'] = $post_id;
            $field_obj = new FileField($field);
            break;
        default:
            break;
    }
    $markup = '';
    if ($field_obj) {
        ob_start();
        ?>
		<tr>
			<th><?php 
        echo $field_obj->label_html();
        ?>
</th>
			<td>
				<?php 
        echo $field_obj->description_html();
        ?>
				<?php 
        echo $field_obj->input_html();
        ?>
			</td>
		</tr>
	<?php 
        $markup = ob_get_clean();
    } else {
        $markup = '<tr><th></th><td>Don\'t know how to handle field of type ' . $field_type . '</td></tr>';
    }
    echo $markup;
}