def METHOD_NAME(source, attr: str, name: str, size: float, owner_object: bpy.types.Object) -> Optional[bpy.types.Object]:
    if getattr(source, attr) is None:
        region_object = create_cube_region(name, size, owner_object)
        setattr(source, attr, region_object)
        try:
            yield region_object
        finally:
            source.property_unset(attr)
    else:
        # contextlib.contextmanager requires for us to yield. Sad.
        yield