/**
  * @param object $object
  *
  * @param array  $fieldsTobeFiltered
  *
  * @return array
  */
 public function extract($object, $fieldsToInclude = [])
 {
     if (!is_object($object)) {
         return $object;
     }
     $hydrator = new Reflection();
     $hydrator->addFilter('exclude', function ($property) use($fieldsToInclude) {
         if (0 == count($fieldsToInclude)) {
             return true;
         }
         if (!in_array($property, $fieldsToInclude)) {
             return false;
         }
         return true;
     }, FilterComposite::CONDITION_AND);
     $resultCopy = $result = $hydrator->extract($object);
     array_walk($resultCopy, function (&$value, $key) use(&$result) {
         if ($value instanceof AbstractModel) {
             $value = $value->getArrayCopy();
         }
         if (is_null($value)) {
             unset($result[$key]);
         }
         if (is_array($value)) {
             array_walk($value, function (&$value) {
                 $value = $this->extract($value);
             });
         }
     });
     return $result;
 }