design patterns in modern c