class A def initialize(options = {}) #what goes on in here doesn't really matter for the purpose of this question #I just don't want it to be initialized directly options.each do |k,v| instance_variable_set("@#{k}",v) unless v.nil? end end end class B < A attr_accessor :class_specific_opt def initialize( options = {} ) @class_specific_opt = "val" unless options[:class_specific_opt].nil? super(options) end end class A def self.initialize_allowed? raise "You cannot initialize instances of this class." end def self.allow_initialize class << self def initialize_allowed? true end end end def initialize(options = {}) self.class.initialize_allowed? options.each do |k,v| instance_variable_set("@#{k}", v) end end end class B < A allow_initialize end B.new #=> # class < NoMethodError: undefined method `new' for A:Class private_class_method :new public_class_method :new class A private_class_method :new end class B < A public_class_method :new end