impl default & factory interface