I think we should either make this final or have an interface + impl