refactor on composition