abstratct refactor