This function is intended to be overridden; sub-classes may return a pre-existing node, instead of a newly allocated one (for cases where only one instance of the node type can exist). Callers should check for this case upon use.