separated interface from implementation