/**
  * Setup the property's display value before its assigned to the object row.
  *
  * This method is useful for classes using this trait.
  *
  * @param  ModelInterface    $object   The current row's object.
  * @param  PropertyInterface $property The current property.
  * @return void
  */
 protected function setupDisplayPropertyValue(ModelInterface $object, PropertyInterface $property)
 {
     $displayType = $property->displayType();
     $this->display = $this->propertyDisplayFactory()->create($displayType);
     $this->display->setDisplayType($displayType);
     $this->display->setProperty($property);
     $metadata = $property->metadata();
     $objMetadata = $object->metadata()->property($property->ident());
     if ($objMetadata) {
         $metadata->setData($objMetadata);
     }
     $this->display->setData($metadata);
     $this->display->setData($property->viewOptions($displayType));
 }
 /**
  * Get all the fields of a model.
  *
  * @param ModelInterface $model      The model to get fields from.
  * @param array|null     $properties Optional list of properties to get. If null, retrieve all (from metadata).
  * @return array
  * @todo Move this method in StorableTrait or AbstractModel
  */
 private function getModelFields(ModelInterface $model, $properties = null)
 {
     if ($properties === null) {
         // No custom properties; use all (from model metadata)
         $properties = array_keys($model->metadata()->properties());
     } else {
         // Ensure the key is always in the required fields.
         $properties = array_merge($properties, [$model->key()]);
     }
     $fields = [];
     foreach ($properties as $propertyIdent) {
         $p = $model->p($propertyIdent);
         if (!$p || !$p->active() || !$p->storable()) {
             continue;
         }
         $v = $model->propertyValue($propertyIdent);
         foreach ($p->fields($v) as $fieldIdent => $field) {
             $fields[$field->ident()] = $field;
         }
     }
     return $fields;
 }