def METHOD_NAME(self, chunk_i=None, **kwargs):
    results = kwargs
    # Run the different plugin computations
    while True:
        for output_name, p in self.sub_plugins.items():
            if output_name in results:
                continue
            if any([d not in results for d in p.depends_on]):
                continue
            compute_kwargs = dict(chunk_i=chunk_i)
            for kind, d_of_kind in p.dependencies_by_kind().items():
                compute_kwargs[kind] = strax.Chunk.merge(
                    [results[d] for d in d_of_kind])
            # Store compute result(s)
            r = p.METHOD_NAME(**compute_kwargs)
            if p.multi_output:
                for d in r:
                    results[d] = r[d]
            else:
                results[output_name] = r
            # Rescan plugins to see if we can compute anything more
            break
        else:
            # Nothing further to compute
            break
    for d in self.provides:
        assert d in results, f"Output {d} missing!"
    # Save anything we can through the inlined savers
    for d, savers in self.sub_savers.items():
        for s in savers:
            s.save(chunk=results[d], chunk_i=chunk_i)
    # Remove results we do not need to send
    for d in list(results.keys()):
        if d not in self.provides:
            del results[d]
    if self.multi_output:
        for k in self.provides:
            assert k in results
            assert isinstance(results[k], strax.Chunk)
            r0 = results[k]
    else:
        results = r0 = results[self.provides[0]]
        assert isinstance(r0, strax.Chunk)
    return self._fix_output(results, start=r0.start, end=r0.end)