По сути (как мне подсказывает опыт) вопрос сводится к следующему: сделать дизайн системы таким, чтобы ожидаемые изменения было внести легко (расширением), а НЕ ожидаемые - трудно.
Из той же оперы: в С++ можно определить свой operator+ для своих типов, но нельзя переопределить operator+ для int - хотя для этого нет технических сложностей.