add interface and implem