can we make this final too? (e.g. using a factory contructor)