/**
  * Build the specification for an edge operation, and possibly build its
  * inverse as well.
  *
  * @task internal
  */
 private function buildEdgeSpecs($src, $type, $dst, array $options = array())
 {
     $data = array();
     if (!empty($options['data'])) {
         $data['data'] = $options['data'];
     }
     $src_type = phid_get_type($src);
     $dst_type = phid_get_type($dst);
     $specs = array();
     $specs[] = array('src' => $src, 'src_type' => $src_type, 'dst' => $dst, 'dst_type' => $dst_type, 'type' => $type, 'data' => $data);
     $inverse = PhabricatorEdgeConfig::getInverse($type);
     if ($inverse) {
         // If `inverse_data` is set, overwrite the edge data. Normally, just
         // write the same data to the inverse edge.
         if (array_key_exists('inverse_data', $options)) {
             $data['data'] = $options['inverse_data'];
         }
         $specs[] = array('src' => $dst, 'src_type' => $dst_type, 'dst' => $src, 'dst_type' => $src_type, 'type' => $inverse, 'data' => $data);
     }
     return $specs;
 }