protected function applyFinalEffects(PhabricatorLiskDAO $object, array $xactions)
 {
     $materialize = false;
     $new_parent = null;
     foreach ($xactions as $xaction) {
         switch ($xaction->getTransactionType()) {
             case PhabricatorTransactions::TYPE_EDGE:
                 switch ($xaction->getMetadataValue('edge:type')) {
                     case PhabricatorProjectProjectHasMemberEdgeType::EDGECONST:
                         $materialize = true;
                         break;
                 }
                 break;
             case PhabricatorProjectTransaction::TYPE_PARENT:
                 $materialize = true;
                 $new_parent = $object->getParentProject();
                 break;
         }
     }
     if ($new_parent) {
         // If we just created the first subproject of this parent, we want to
         // copy all of the real members to the subproject.
         if (!$new_parent->getHasSubprojects()) {
             $member_type = PhabricatorProjectProjectHasMemberEdgeType::EDGECONST;
             $project_members = PhabricatorEdgeQuery::loadDestinationPHIDs($new_parent->getPHID(), $member_type);
             if ($project_members) {
                 $editor = id(new PhabricatorEdgeEditor());
                 foreach ($project_members as $phid) {
                     $editor->addEdge($object->getPHID(), $member_type, $phid);
                 }
                 $editor->save();
             }
         }
     }
     if ($this->getIsNewObject()) {
         $this->setDefaultProfilePicture($object);
     }
     // TODO: We should dump an informational transaction onto the parent
     // project to show that we created the sub-thing.
     if ($materialize) {
         id(new PhabricatorProjectsMembershipIndexEngineExtension())->rematerialize($object);
     }
     return parent::applyFinalEffects($object, $xactions);
 }
 protected function applyFinalEffects(PhabricatorLiskDAO $object, array $xactions)
 {
     $materialize = false;
     foreach ($xactions as $xaction) {
         switch ($xaction->getTransactionType()) {
             case PhabricatorTransactions::TYPE_EDGE:
                 switch ($xaction->getMetadataValue('edge:type')) {
                     case PhabricatorProjectProjectHasMemberEdgeType::EDGECONST:
                         $materialize = true;
                         break;
                 }
                 break;
             case PhabricatorProjectTransaction::TYPE_PARENT:
                 $materialize = true;
                 break;
         }
     }
     if ($materialize) {
         id(new PhabricatorProjectsMembershipIndexEngineExtension())->rematerialize($object);
     }
     return parent::applyFinalEffects($object, $xactions);
 }