def METHOD_NAME(
    arg: ParticleLike,
    *,
    mass_numb: Optional[Integral] = None,
    symbol: Optional[str] = None,
    Z: Optional[Real] = None,
):
    """
    Create a |CustomParticle| for mean or composite ions.
    This function is intended to produce |CustomParticle| instances
    provided a string representing an element or isotope without charge
    information (e.g., ``"He"`` or ``"He-4"`` but not ``"He-4 2+"``)
    along with a charge number that is a real number but not an integer.
    Parameters
    ----------
    arg : |particle-like|
        An appropriate first argument to |Particle|.
    mass_numb : real number, optional
        The mass number of an isotope.
    symbol : str, optional
        The symbol of the particle.
    Z : real number, optional
        The charge number.
    Raises
    ------
    |InvalidParticleError|
        If the |CustomParticle| cannot be created.
    Examples
    --------
    >>> _make_custom_particle_with_real_charge_number("He-4", Z=1.5)
    CustomParticle(mass=6.64511...e-27 kg, charge=2.40326...e-19 C)
    >>> _make_custom_particle_with_real_charge_number("He", Z=1.5, mass_numb=4)
    CustomParticle(mass=6.64511...e-27 kg, charge=2.40326...e-19 C)
    """
    if not isinstance(Z, (Real, u.Quantity)) and Z is not None:
        raise ChargeError("The charge number must be a real number.")
    base_particle = Particle(arg, mass_numb=mass_numb, Z=0)
    if not base_particle.is_category(require="element", exclude="ion"):
        # Add tests if this function becomes part of public API
        raise InvalidParticleError("Cannot create CustomParticle.")  # coverage: ignore
    if Z > base_particle.atomic_number:
        raise ChargeError("The charge number cannot exceed the atomic number.")
    mass = base_particle.mass - m_e * Z
    return CustomParticle(mass=mass, Z=Z, symbol=symbol)