/**
  * Short description of method referenceResource
  *
  * @access public
  * @author Joel Bout, <*****@*****.**>
  * @param  Resource resource
  * @param  string table
  * @param  array types
  * @param  boolean referenceClassLink
  * @return boolean
  */
 public function referenceResource(\core_kernel_classes_Resource $resource, $table, $types = null, $referenceClassLink = false)
 {
     $returnValue = (bool) false;
     $types = !is_null($types) ? $types : $resource->getTypes();
     $rows = array();
     if (!$this->isResourceReferenced($resource)) {
         $dbWrapper = \core_kernel_classes_DbWrapper::singleton();
         $query = 'INSERT INTO "resource_to_table" ("uri", "table") VALUES (?,?)';
         $insertResult = $dbWrapper->exec($query, array($resource->getUri(), $table));
         if ($referenceClassLink && $insertResult !== false) {
             $query = 'SELECT * FROM "resource_to_table" WHERE "uri" = ? AND "table" = ?';
             $result = $dbWrapper->query($query, array($resource->getUri(), $table));
             while ($row = $result->fetch(\PDO::FETCH_ASSOC)) {
                 $rows[] = $row;
             }
         }
         $returnValue = (bool) $insertResult;
         if ($referenceClassLink) {
             foreach ($types as $type) {
                 $typeClass = new \core_kernel_classes_Class($type->getUri());
                 if ($this->isClassReferenced($typeClass)) {
                     $classLocations = $this->classLocations($typeClass);
                     foreach ($classLocations as $classLocation) {
                         foreach ($rows as $row) {
                             $query = "INSERT INTO resource_has_class (resource_id, class_id) VALUES (?,?)";
                             $sth = $dbWrapper->exec($query, array($row['id'], $classLocation['id']));
                         }
                     }
                 }
             }
         }
         if ($returnValue) {
             foreach ($rows as $row) {
                 self::$_resources[$row['uri']] = $row['table'];
             }
             ResourceProxy::singleton()->uncacheResource($resource);
         }
     }
     return (bool) $returnValue;
 }
 public function testForceMode()
 {
     $this->hardify();
     // Check if the returner implementation are correct
     PersistenceProxy::forceMode(PERSISTENCE_SMOOTH);
     $classProxy = ClassProxy::singleton();
     $impl = $classProxy->getImpToDelegateTo($this->targetSubjectClass);
     $this->assertTrue($impl instanceof core_kernel_persistence_smoothsql_Class);
     $this->assertEquals(count($this->targetSubjectClass->getInstances()), 1);
     $this->assertEquals(count($this->targetSubjectSubClass->getInstances()), 1);
     PersistenceProxy::restoreImplementation();
     $this->assertTrue(ClassProxy::singleton()->getImpToDelegateTo($this->targetSubjectClass) instanceof Clazz);
     $this->assertTrue(ResourceProxy::singleton()->getImpToDelegateTo($this->subject1) instanceof Resource);
 }