code: def _split_parent(self, old_node: Node):
      parent = old_node.parent
      new_node = self.InternalNode(page=self._mem.next_available_page)
      new_entries = old_node.split_entries()
      new_node.entries = new_entries
  
      ref = new_node.pop_smallest()
      ref.before = old_node.page
      ref.after = new_node.page
  
      if isinstance(old_node, RootNode):
          # Convert the Root into an Internal
          old_node = old_node.convert_to_internal()
          self._create_new_root(ref)
      elif parent.can_add_entry:
          parent.insert_entry(ref)
          self._mem.set_node(parent)
      else:
          parent.insert_entry(ref)
          self._split_parent(parent)
  
      self._mem.set_node(old_node)
      self._mem.set_node(new_node)
  
imports: from functools import partial
  from logging import getLogger
  from typing import Optional, Union, Iterator, Iterable
  from .None import utils
  from .const import TreeConf
  from .entry import Record, Reference, OpaqueData
  from .memory import FileMemory
  from .node import Node, LonelyRootNode, RootNode, InternalNode, LeafNode, OverflowNode
  from .serializer import Serializer, IntSerializer
label_desc: Use image node_id 26 for calling the BPlusTree obj's underlying member method code with example usage: obj._split_parent(old_node) without return types