program to interface not to implementation