def METHOD_NAME(
        item, prop, *, default,
        min=0.0, max=1.0,
        soft_min=None, soft_max=None,
        description=None,
        overridable=False,
        subtype=None,
        id_type='OBJECT',
):
    """Create and initialize a custom property with limits, defaults and other settings."""
    # Assign the value
    item[prop] = default
    rna_idprop_ui_prop_update(item, prop)
    ui_data = item.id_properties_ui(prop)
    proptype, _ = rna_idprop_value_item_type(default)
    if (proptype is bool) or (proptype is str):
        ui_data.update(
            description=description,
            default=default,
        )
    elif proptype is type(None) or issubclass(proptype, bpy.types.ID):
        ui_data.update(
            description=description,
            default=default,
            id_type=id_type,
        )
    else:
        if soft_min is None:
            soft_min = min
        if soft_max is None:
            soft_max = max
        ui_data.update(
            subtype=subtype,
            min=min,
            max=max,
            soft_min=soft_min,
            soft_max=soft_max,
            description=description,
            default=default,
        )
    prop_path = rna_idprop_quote_path(prop)
    item.property_overridable_library_set(prop_path, overridable)