libs-base/Source/Additions/NSObject+GNUstepBase.m
Richard Frith-MacDonald 0592b48e55 Raise when attempting to use unimplemented classes. Check for null pointers
in more runtime functions (probably still many cases where we crash if null
pointers are passed to the API and Apple behave more tolrantly).


git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@32124 72102866-910b-0410-8b05-ffd578937521
2011-02-13 06:31:05 +00:00

140 lines
3.6 KiB
Objective-C

/* Implementation of extension methods to base additions
Copyright (C) 2010 Free Software Foundation, Inc.
Written by: Richard Frith-Macdonald <rfm@gnu.org>
This file is part of the GNUstep Base Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02111 USA.
*/
#import "common.h"
#import "Foundation/NSException.h"
#import "GNUstepBase/NSObject+GNUstepBase.h"
#import "GNUstepBase/NSDebug+GNUstepBase.h"
/**
* Extension methods for the NSObject class
*/
@implementation NSObject (GNUstepBase)
+ (id) notImplemented: (SEL)selector
{
[NSException raise: NSGenericException
format: @"method %@ not implemented in %s(class)",
selector ? (id)NSStringFromSelector(selector) : (id)@"(null)",
NSStringFromClass(self)];
return nil;
}
- (NSComparisonResult) compare: (id)anObject
{
NSLog(@"WARNING: The -compare: method for NSObject is deprecated.");
if (anObject == self)
{
return NSOrderedSame;
}
if (anObject == nil)
{
[NSException raise: NSInvalidArgumentException
format: @"nil argument for compare:"];
}
if ([self isEqual: anObject])
{
return NSOrderedSame;
}
/*
* Ordering objects by their address is pretty useless,
* so subclasses should override this is some useful way.
*/
if ((id)self > anObject)
{
return NSOrderedDescending;
}
else
{
return NSOrderedAscending;
}
}
- (BOOL) isInstance
{
GSOnceMLog(@"Warning, the -isInstance method is deprecated. "
@"Use 'class_isMetaClass([self class]) ? NO : YES' instead");
return class_isMetaClass([self class]) ? NO : YES;
}
- (id) makeImmutableCopyOnFail: (BOOL)force
{
if (force == YES)
{
return AUTORELEASE([self copy]);
}
return self;
}
- (id) notImplemented: (SEL)aSel
{
char c = (class_isMetaClass(object_getClass(self)) ? '+' : '-');
[NSException
raise: NSGenericException
format: @"[%@%c%@] not implemented",
NSStringFromClass([self class]), c,
aSel ? (id)NSStringFromSelector(aSel) : (id)@"(null)"];
return nil;
}
- (id) notImplemented: (SEL)aSel reason: (NSString*)reason
{
char c = (class_isMetaClass(object_getClass(self)) ? '+' : '-');
[NSException
raise: NSGenericException
format: @"[%@%c%@] not implemented ... %@",
NSStringFromClass([self class]), c,
aSel ? (id)NSStringFromSelector(aSel) : (id)@"(null)",
reason];
return nil;
}
- (id) shouldNotImplement: (SEL)aSel
{
char c = (class_isMetaClass(object_getClass(self)) ? '+' : '-');
[NSException
raise: NSGenericException
format: @"[%@%c%@] should not be implemented",
NSStringFromClass([self class]), c,
aSel ? (id)NSStringFromSelector(aSel) : (id)@"(null)"];
return nil;
}
- (id) subclassResponsibility: (SEL)aSel
{
char c = (class_isMetaClass(object_getClass(self)) ? '+' : '-');
[NSException raise: NSGenericException
format: @"[%@%c%@] should be overridden by subclass",
NSStringFromClass([self class]), c,
aSel ? (id)NSStringFromSelector(aSel) : (id)@"(null)"];
return nil;
}
@end