Nope, `addressBelongsToZone` handles nested zones, and my first implementation was using it:

```php
public function matchAll(AddressInterface $address)
    {
        $zones = array();
        foreach ($this->getZones() as $zone) {
            if ($this->addressBelongsToZone($address, $zone)) {
                $zones[] = $zone;
            }
        }

        return $zones;
    }
```
 But in that case, you will get only top zones, you will never get child zones even if they match given address.
For example, if you have USA zone, and zone member NY + Foo zone, and want to match all zones for NY address, you will only get USA, but miss NY + Foo and NY zones. That's why we need to collect zones recursivelly, to pick child zones.