--- /dev/null
+/*
+ * ITKit
+ * ITCategory-NSObject.h
+ * Category which extends NSObject
+ *
+ * Original Author : Joseph Spiros <joseph.spiros@ithinksw.com>
+ * Responsibility : Joseph Spiros <joseph.spiros@ithinksw.com>
+ *
+ * Copyright (c) 2002 - 2004 iThink Software.
+ * All Rights Reserved
+ *
+ */
+
+
+#import <Cocoa/Cocoa.h>
+
+
+@interface NSObject (ITCategory)
+
++ (NSArray *)subclasses;
++ (NSArray *)directSubclasses;
+
+
+@end
--- /dev/null
+#import "ITCategory-NSObject.h"
+#import <objc/objc-runtime.h>
+
+@implementation NSObject (ITCategory)
+
++ (NSArray *)subclasses
+{
+ NSMutableArray *tempArray;
+ NSArray *resultArray;
+ Class *classes;
+ struct objc_class *superClass;
+ Class *current;
+ int count, newCount, index;
+
+ tempArray = [[NSMutableArray allocWithZone:nil] initWithCapacity:12];
+ resultArray = nil;
+
+ if (tempArray)
+ {
+ classes = NULL;
+ count = objc_getClassList(NULL, 0);
+ if (count)
+ {
+ classes = malloc(sizeof(Class) * count);
+ if (classes)
+ {
+ newCount = objc_getClassList(classes, count);
+ while (count < newCount)
+ {
+ count = newCount;
+ free(classes);
+ classes = malloc(sizeof(Class) * count);
+ if (classes)
+ newCount = objc_getClassList(classes, count);
+ }
+ count = newCount;
+ }
+ }
+
+ if (classes)
+ {
+ const Class thisClass = [self class];
+ current = classes;
+
+ for (index = 0; index < count; ++index)
+ {
+ superClass = (*current)->super_class;
+ if (superClass)
+ {
+ do
+ {
+ if (superClass == thisClass)
+ {
+ [tempArray addObject:*current];
+ break;
+ }
+ superClass = superClass->super_class;
+ } while (superClass);
+ }
+
+ ++current;
+ }
+
+ free(classes);
+ }
+
+ resultArray = [NSArray arrayWithArray:tempArray];
+ [tempArray release];
+ }
+
+ return resultArray;
+}
+
++ (NSArray *)directSubclasses
+{
+ NSMutableArray *tempArray;
+ NSArray *resultArray;
+ Class *classes;
+ Class *current;
+ int count, newCount, index;
+
+ tempArray = [[NSMutableArray allocWithZone:nil] initWithCapacity:12];
+ resultArray = nil;
+
+ if (tempArray)
+ {
+ classes = NULL;
+ count = objc_getClassList(NULL, 0);
+ if (count)
+ {
+ classes = malloc(sizeof(Class) * count);
+ if (classes)
+ {
+ newCount = objc_getClassList(classes, count);
+ while (count < newCount)
+ {
+ count = newCount;
+ free(classes);
+ classes = malloc(sizeof(Class) * count);
+ if (classes)
+ newCount = objc_getClassList(classes, count);
+ }
+ count = newCount;
+ }
+ }
+
+ if (classes)
+ {
+ const Class thisClass = [self class];
+ current = classes;
+
+ for (index = 0; index < count; ++index)
+ {
+ if ((*current)->super_class == thisClass)
+ [tempArray addObject:*current];
+ ++current;
+ }
+
+ free(classes);
+ }
+
+ resultArray = [NSArray arrayWithArray:tempArray];
+ [tempArray release];
+ }
+
+ return resultArray;
+}
+
+@end
\ No newline at end of file
//2A4
2AB93A2C057059DC007E748F = {
children = (
+ 7C058DF7072F10530082E1E9,
+ 7C058DF8072F10530082E1E9,
2AB93A3005705A0C007E748F,
2AB93A3105705A0C007E748F,
);
//7C2
//7C3
//7C4
+ 7C058DF7072F10530082E1E9 = {
+ fileEncoding = 4;
+ isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.h;
+ path = "ITCategory-NSObject.h";
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 7C058DF8072F10530082E1E9 = {
+ fileEncoding = 4;
+ isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.objc;
+ path = "ITCategory-NSObject.m";
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 7C058DF9072F10530082E1E9 = {
+ fileRef = 7C058DF7072F10530082E1E9;
+ isa = PBXBuildFile;
+ settings = {
+ ATTRIBUTES = (
+ Public,
+ );
+ };
+ };
+ 7C058DFA072F10530082E1E9 = {
+ fileRef = 7C058DF8072F10530082E1E9;
+ isa = PBXBuildFile;
+ settings = {
+ };
+ };
7C97DC2C05B614300013E85F = {
fileEncoding = 4;
isa = PBXFileReference;
3D97137F05D9FBF40033607F,
3D97138A05D9FD6B0033607F,
376AF4DF06597CA900F0979E,
+ 7C058DF9072F10530082E1E9,
);
isa = PBXHeadersBuildPhase;
runOnlyForDeploymentPostprocessing = 0;
3D97138105D9FBFA0033607F,
3D97138B05D9FD6B0033607F,
376AF4E006597CA900F0979E,
+ 7C058DFA072F10530082E1E9,
);
isa = PBXSourcesBuildPhase;
runOnlyForDeploymentPostprocessing = 0;