protected function newItemFromProperties(NuanceRequestor $requestor, array $properties, PhabricatorContentSource $content_source)
 {
     // TODO: Should we have a tighter actor/viewer model? Requestors will
     // often have no real user associated with them...
     $actor = PhabricatorUser::getOmnipotentUser();
     $source = $this->requireSourceObject();
     $item = NuanceItem::initializeNewItem();
     $xactions = array();
     $xactions[] = id(new NuanceItemTransaction())->setTransactionType(NuanceItemTransaction::TYPE_SOURCE)->setNewValue($source->getPHID());
     $xactions[] = id(new NuanceItemTransaction())->setTransactionType(NuanceItemTransaction::TYPE_REQUESTOR)->setNewValue($requestor->getPHID());
     foreach ($properties as $key => $property) {
         $xactions[] = id(new NuanceItemTransaction())->setTransactionType(NuanceItemTransaction::TYPE_PROPERTY)->setMetadataValue(NuanceItemTransaction::PROPERTY_KEY, $key)->setNewValue($property);
     }
     $editor = id(new NuanceItemEditor())->setActor($actor)->setActingAsPHID($requestor->getActingAsPHID())->setContentSource($content_source);
     $editor->applyTransactions($item, $xactions);
     return $item;
 }