dependency inversion principle & delegate invoker