Yeah, so let's go with that.  The `__init__` and `list_features` stay up in the base.  Maybe a portion of the `raw` as well - the base `raw` could be a simple loop like:

```python
def raw(**kwargs):
    retvals = []
    features = ... # get list of features we're after
    for feature in features:
        url = self._get_feature_url(feature)   # implemented in derived class
        retvals.append(self._get_raw_data(feature, url))   # implemented in derived class
    return retvals
```

This way the filtering/determination of which features to get is all handled in the base and the derived classes only care about which specific data product they're getting.