¿Es posible llamar al modificador de clase padre?

Quiero hacer lo siguiente:

contract Base {
    bool public active;

    modifier canSetMetadata() {
        require(active == false);
        _;
    }
}

contract BaseWithMetadataControl is Base {
    address public metadataControl;

    modifier canSetMetadata() {
        if(msg.sender != metadataControl) {
            super.canSetMetadata();
        }
        _;
    }
}

Entonces, la clase secundaria debe llamar al modificador de clase principal. No parece ser posible, pero no quiero duplicar el código modificador porque es probable que cambie...

Respuestas (1)

Podría anular una función interna que implementa el control

pragma solidity 0.4.24;

contract Base {
    bool public active;

    modifier canSetMetadata() {
        require(canSetMetadata_());
        _;
    }

    function canSetMetadata_() internal view returns (bool) {
        return (active == false);
    }
}

contract BaseWithMetadataControl is Base {
    address public metadataControl;

    function canSetMetadata_() internal view returns (bool) {
        if(msg.sender != metadataControl) {
            return super.canSetMetadata_();
        } else {
            return true;
        }
    }
}
Esto es exactamente lo que también se me ocurrió mientras tanto :)