internal static RubyClass/*!*/ DefineClass(Scope/*!*/ autoloadScope, RubyModule/*!*/ owner, string/*!*/ name, object superClassObject) {
Assert.NotNull(owner);
RubyClass superClass = ToSuperClass(owner.Context, superClassObject);
object existing;
if (ReferenceEquals(owner, owner.Context.ObjectClass)
? owner.TryResolveConstant(autoloadScope, name, out existing)
: owner.TryGetConstant(autoloadScope, name, out existing)) {
RubyClass cls = existing as RubyClass;
if (cls == null || !cls.IsClass) {
throw RubyExceptions.CreateTypeError(String.Format("{0} is not a class", name));
}
if (superClassObject != null && !ReferenceEquals(cls.SuperClass, superClass)) {
throw RubyExceptions.CreateTypeError(String.Format("superclass mismatch for class {0}", name));
}
return cls;
} else {
return owner.Context.DefineClass(owner, name, superClass);
}
}