protected function getDataValue(array $data, $property)
    {
        $value = null;
        if (array_key_exists($property, $data)) {
            // Found: return the value.
            $value = $data[$property];
        } else {
            // Not found: check in meta data or descend recursively.
            if (isset($data['meta_data'])) {
                $value = $this->getMetaDataValue($data['meta_data'], $property);
            }
            if ($value === null) {
                // Not found in meta_data: check if we should descend a level.
                $propertyParts = explode('_', $property, 2);
                if (count($propertyParts) === 2 && array_key_exists($propertyParts[0], $data) && is_array($data[$propertyParts[0]])) {
                    $value = $this->getDataValue($data[$propertyParts[0]], $propertyParts[1]);
                }
            }
        }
        return $value;
    }