/**
  * Creates the object in the database as the original object will be wiped.
  *
  * @param string $class
  * @param string $identifier
  * @param array $data
  */
 public function createObject($class, $identifier, $data = null)
 {
     DB::alteration_message("Creating {$identifier} ({$class})", "created");
     if ($data) {
         foreach ($data as $k => $v) {
             if (!is_array($v) && preg_match('/^`(.)*`;$/', $v)) {
                 $str = substr($v, 1, -2);
                 $pv = null;
                 eval("\$pv = {$str};");
                 $data[$k] = $pv;
             }
         }
     }
     // for files copy the source dir if the image has a 'PopulateFileFrom'
     if (isset($data['PopulateFileFrom'])) {
         $folder = Folder::find_or_make(str_replace('assets/', '', dirname($data['Filename'])));
         @copy(BASE_PATH . '/' . $data['PopulateFileFrom'], BASE_PATH . '/' . $data['Filename']);
     }
     // if any merge labels are defined then we should create the object
     // from that
     $lookup = null;
     $mode = null;
     if (isset($data['PopulateMergeWhen'])) {
         $mode = 'PopulateMergeWhen';
         $lookup = DataList::create($class)->where($data['PopulateMergeWhen']);
         unset($data['PopulateMergeWhen']);
     } else {
         if (isset($data['PopulateMergeMatch'])) {
             $mode = 'PopulateMergeMatch';
             $filter = array();
             foreach ($data['PopulateMergeMatch'] as $field) {
                 $filter[$field] = $data[$field];
             }
             if (!$filter) {
                 throw new Exception('Not a valid PopulateMergeMatch filter');
             }
             $lookup = DataList::create($class)->filter($filter);
             unset($data['PopulateMergeMatch']);
         } else {
             if (isset($data['PopulateMergeAny'])) {
                 $mode = 'PopulateMergeAny';
                 $lookup = DataList::create($class);
                 unset($data['PopulateMergeAny']);
             }
         }
     }
     if ($lookup && $lookup->count() > 0) {
         $existing = $lookup->first();
         foreach ($lookup as $old) {
             if ($old->ID == $existing->ID) {
                 continue;
             }
             if ($old->hasExtension('Versioned')) {
                 foreach ($old->getVersionedStages() as $stage) {
                     $old->deleteFromStage($stage);
                 }
             }
             $old->delete();
         }
         $blueprint = new FixtureBlueprint($class);
         $obj = $blueprint->createObject($identifier, $data, $this->fixtures);
         $latest = $obj->toMap();
         unset($latest['ID']);
         $existing->update($latest);
         $existing->write();
         $obj->delete();
         $this->fixtures[$class][$identifier] = $existing->ID;
         $obj = $existing;
         $obj->flushCache();
     } else {
         $obj = parent::createObject($class, $identifier, $data);
     }
     if ($obj->hasExtension('Versioned')) {
         foreach ($obj->getVersionedStages() as $stage) {
             if ($stage !== $obj->getDefaultStage()) {
                 $obj->writeToStage($obj->getDefaultStage());
                 $obj->publish($obj->getDefaultStage(), $stage);
             }
         }
         $obj->flushCache();
     }
     return $obj;
 }
 public function testDefineWithDefaultCustomSetters()
 {
     $blueprint = new FixtureBlueprint('FixtureFactoryTest_DataObject', null, array('Name' => function ($obj, $data, $fixtures) {
         return 'Default Name';
     }));
     $obj1 = $blueprint->createObject('one');
     $this->assertEquals('Default Name', $obj1->Name);
     $obj2 = $blueprint->createObject('one', array('Name' => 'Override Name'));
     $this->assertEquals('Override Name', $obj2->Name);
 }