The implementation in #3 will always make new public, regardless of the visibility it had previously.
Desired behaviour:
class PrivateNew
private_class_method :new
end
class MyAbstractClass < PrivateNew
abstract!
end
p MyAbstractClass.singleton_class.public_method_defined?(:new)
# is true, should be false
class MySubclass < MyAbstractClass; end
p MySubclass.singleton_class.public_method_defined?(:new)
# is true, should be false