dependency inversion principle real world example