public function findOrMakeObject($identifier, $data = null, $fixtures = null, $filter = [])
    {
        // Handle Default Parent:
        
        if (($ID = $this->getDefaultParent()) && !isset($data['ParentID'])) {
            $data['ParentID'] = $filter['ParentID'] = $ID;
        }
        
        // Obtain Existing Object:
        
        $object = $this->findObject($identifier, $data, $filter);
        
        // Create Object (if does not exist):
        
        if (!$object) {
            
            // Create Object Instance:
            
            $object = $this->makeObject();
            
            // Populate Identifier:
            
            $this->populateIdentifier($object, $identifier);
            
            // Populate Defaults:
            
            $this->populateDefaults($object, $identifier, $data, $fixtures);
            
            // Populate Parent:
            
            $this->populateParent($object, $data);
            
            // Show Create Message:
            
            $this->createMessage($object, $identifier);
            
        } else {
            
            // Show Update Message:
            
            $this->updateMessage($object, $identifier);
            
        }
        
        // Mutate Class (if required):
        
        $object = $this->mutateClass($object, $identifier, $data);
        
        // Write Object to Database:
        
        $object->write();
        
        // Handle Versioning:
        
        $this->publishObject($object);
        
        // Record Object in Fixtures:
        
        $this->addFixture($object, $identifier);
        
        // Answer Object:
        
        return $object;
    }