code: public function addChild($parent, $child)
      {
          if ($parent->name === $child->name) {
              throw new InvalidArgumentException("Cannot add '{$parent->name}' as a child of itself.");
          }
  
          if ($parent instanceof Permission && $child instanceof Role) {
              throw new InvalidArgumentException('Cannot add a role as a child of a permission.');
          }
  
          if ($this->detectLoop($parent, $child)) {
              throw new InvalidCallException("Cannot add '{$child->name}' as a child of '{$parent->name}'. A loop has been detected.");
          }
  
          $this->db->createCommand()
              ->insert($this->itemChildTable, ['parent' => $parent->name, 'child' => $child->name])
              ->execute();
  
          $this->invalidateCache();
  
          return true;
      }
docs: {@inheritdoc}