add factory & exception