user: Give a detailed overview of NodeInternal(Node): syntax, arguments, return values, common patterns.

assistant: # NodeInternal(Node)

base classes — [`bpy_struct`](bpy.types.bpy_struct.html#bpy.types.bpy_struct "bpy.types.bpy_struct"), [`Node`](bpy.types.Node.html#bpy.types.Node "bpy.types.Node")

subclasses —
[`CompositorNode`](bpy.types.CompositorNode.html#bpy.types.CompositorNode "bpy.types.CompositorNode"), [`FunctionNode`](bpy.types.FunctionNode.html#bpy.types.FunctionNode "bpy.types.FunctionNode"), [`GeometryNode`](bpy.types.GeometryNode.html#bpy.types.GeometryNode "bpy.types.GeometryNode"), [`NodeClosureInput`](bpy.types.NodeClosureInput.html#bpy.types.NodeClosureInput "bpy.types.NodeClosureInput"), [`NodeClosureOutput`](bpy.types.NodeClosureOutput.html#bpy.types.NodeClosureOutput "bpy.types.NodeClosureOutput"), [`NodeCombineBundle`](bpy.types.NodeCombineBundle.html#bpy.types.NodeCombineBundle "bpy.types.NodeCombineBundle"), [`NodeEnableOutput`](bpy.types.NodeEnableOutput.html#bpy.types.NodeEnableOutput "bpy.types.NodeEnableOutput"), [`NodeEvaluateClosure`](bpy.types.NodeEvaluateClosure.html#bpy.types.NodeEvaluateClosure "bpy.types.NodeEvaluateClosure"), [`NodeFrame`](bpy.types.NodeFrame.html#bpy.types.NodeFrame "bpy.types.NodeFrame"), [`NodeGroup`](bpy.types.NodeGroup.html#bpy.types.NodeGroup "bpy.types.NodeGroup"), [`NodeGroupInput`](bpy.types.NodeGroupInput.html#bpy.types.NodeGroupInput "bpy.types.NodeGroupInput"), [`NodeGroupOutput`](bpy.types.NodeGroupOutput.html#bpy.types.NodeGroupOutput "bpy.types.NodeGroupOutput"), [`NodeJoinBundle`](bpy.types.NodeJoinBundle.html#bpy.types.NodeJoinBundle "bpy.types.NodeJoinBundle"), [`NodeReroute`](bpy.types.NodeReroute.html#bpy.types.NodeReroute "bpy.types.NodeReroute"), [`NodeSeparateBundle`](bpy.types.NodeSeparateBundle.html#bpy.types.NodeSeparateBundle "bpy.types.NodeSeparateBundle"), [`ShaderNode`](bpy.types.ShaderNode.html#bpy.types.ShaderNode "bpy.types.ShaderNode"), [`TextureNode`](bpy.types.TextureNode.html#bpy.types.TextureNode "bpy.types.TextureNode")

*class* bpy.types.NodeInternal(*Node*)
:   *classmethod* poll(*node_tree*)
    :   If non-null output is returned, the node type can be added to the tree

        Parameters:
        :   **node_tree** ([`NodeTree`](bpy.types.NodeTree.html#bpy.types.NodeTree "bpy.types.NodeTree")) – Node Tree

        Return type:
        :   boolean

    poll_instance(*node_tree*)
    :   If non-null output is returned, the node can be added to the tree

        Parameters:
        :   **node_tree** ([`NodeTree`](bpy.types.NodeTree.html#bpy.types.NodeTree "bpy.types.NodeTree")) – Node Tree

        Return type:
        :   boolean

    update()
    :   Update on node graph topology changes (adding or removing nodes and links)

    draw_buttons(*context*, *layout*)
    :   Draw node buttons

        Parameters:
        :   **layout** ([`UILayout`](bpy.types.UILayout.html#bpy.types.UILayout "bpy.types.UILayout"), (never None)) – Layout, Layout in the UI

    draw_buttons_ext(*context*, *layout*)
    :   Draw node buttons in the sidebar

        Parameters:
        :   **layout** ([`UILayout`](bpy.types.UILayout.html#bpy.types.UILayout "bpy.types.UILayout"), (never None)) – Layout, Layout in the UI

    *classmethod* bl_rna_get_subclass(*id*, *default=None*, */*)
    :   Parameters:
        :   **id** (*str*) – The RNA type identifier.

        Returns:
        :   The RNA type or default when not found.

        Return type:
        :   [`bpy.types.Struct`](bpy.types.Struct.html#bpy.types.Struct "bpy.types.Struct") subclass

    *classmethod* bl_rna_get_subclass_py(*id*, *default=None*, */*)
    :   Parameters:
        :   **id** (*str*) – The RNA type identifier.

        Returns:
        :   The class or default when not found.

        Return type:
        :   type