def METHOD_NAME(source, channels, start=None, end=None, series_class=TimeSeries,
         scaled=None):
    """Read data from one or more GWF files using the FrameL API
    """
    # scaled must be provided to provide a consistent API with frameCPP
    if scaled is not None:
        warnings.warn(
            "the `scaled` keyword argument is not supported by framel, "
            "if you require ADC scaling, please install "
            "python-ldas-tools-framecpp",
        )
    # parse input source
    source = file_list(source)
    # get duration
    crop = start is None and end is not None
    duration = -1
    span = Segment(start or 0, end or 0)
    framelstart = start or -1
    if start and end:
        duration = end - start
    # read each file and channel individually and append
    out = series_class.DictClass()
    for i, file_ in enumerate(source):
        for name in channels:
            new = _read_channel(
                file_,
                name,
                framelstart,
                duration,
                series_class,
            )
            if crop and end < new.x0.value:
                raise ValueError(
                    "read() given end GPS earlier than start GPS for "
                    "{} in {}".format(
                        name,
                        file_,
                    ),
                )
            elif crop:
                new = new.crop(end=end)
            out.append({name: new})
        # if we have all of the data we want, stop now
        if all(span in out[channel].span for channel in out):
            break
    return out