Hi Quentin,
Here's my first attempt at the refactoring.

I changed any implementations of the -(NSArray *)properties methods to
-(NSArray*)propertyNames, and removed the [super properties]
arrayByAddingObjectsInArray: properties]; bits, so they just return
the properties for that class.

The -(NSArray *)allPropertyNames method is implemented in
EtoileFoundation/ETPropertyValueCoding.m, in an NSObject category, but
not part of the ETPropertyValueCoding protocol. I thought this is the
best approach, since allPropertyNames only needs to be overridden if
an object wants to hide/not inherit properties from its superclasses.


Eric
Index: Frameworks/CoreObject/COFile.m
===================================================================
--- Frameworks/CoreObject/COFile.m	(revision 4772)
+++ Frameworks/CoreObject/COFile.m	(working copy)
@@ -121,11 +121,10 @@
 
 // TODO: Optimize, probably horribly slow. Also not sure we got to expose NSObject 
 // properties by default
-- (NSArray *) properties
+- (NSArray *) propertyNames
 {
 	NSArray *properties = [[self metadatas] allKeys];
 
-	properties = [properties arrayByAddingObjectsFromArray: [super properties]];
 	/* icon, name, displayName and URL are declared in metadatas */
 	properties = [properties arrayByAddingObjectsFromArray: 
 		A(@"isCopyPromise", @"exists", @"metadatas", @"uniqueID")];
Index: Frameworks/CoreObject/TestFile.m
===================================================================
--- Frameworks/CoreObject/TestFile.m	(revision 4772)
+++ Frameworks/CoreObject/TestFile.m	(working copy)
@@ -64,7 +64,7 @@
 
 - (void) testProperties
 {
-	id properties = [self properties];
+	id properties = [self allPropertyNames];
 
 	UKNotNil(properties); 
 	UKTrue([properties count] > 0);
Index: Frameworks/CoreObject/Headers/COFile.h
===================================================================
--- Frameworks/CoreObject/Headers/COFile.h	(revision 4772)
+++ Frameworks/CoreObject/Headers/COFile.h	(working copy)
@@ -21,7 +21,7 @@
 
 - (NSString *) uniqueID;
 - (NSURL *) URL;
-- (NSArray *) properties;
+- (NSArray *) propertyNames;
 - (NSDictionary *) metadatas;
 - (NSString *) name;
 - (NSString *) displayName;
Index: Frameworks/CoreObject/Headers/COCoreObjectProtocol.h
===================================================================
--- Frameworks/CoreObject/Headers/COCoreObjectProtocol.h	(revision 4772)
+++ Frameworks/CoreObject/Headers/COCoreObjectProtocol.h	(working copy)
@@ -14,7 +14,7 @@
 	Properties should encompass all model attributes and relationships that you 
 	want to publish. Your Property-Value Coding implementation will determine
 	for each one whether they are readable, writable or both.*/
-- (NSArray *) properties;
+- (NSArray *) propertyNames;
 /** Returns the metadatas of the receiver to be indexed by the metadata server. 
 	The set of metadatas may intersect or not the set of properties. */
 - (NSDictionary *) metadatas;
Index: Frameworks/CoreObject/Headers/COObject.h
===================================================================
--- Frameworks/CoreObject/Headers/COObject.h	(revision 4772)
+++ Frameworks/CoreObject/Headers/COObject.h	(working copy)
@@ -86,7 +86,7 @@
 
 /* Managed Object Edition */
 
-- (NSArray *) properties;
+- (NSArray *) propertyNames;
 - (BOOL) removeValueForProperty: (NSString *) property;
 - (BOOL) setValue: (id) value forProperty: (NSString *) property;
 - (id) valueForProperty: (NSString *) property;
Index: Frameworks/CoreObject/COObject.m
===================================================================
--- Frameworks/CoreObject/COObject.m	(revision 4772)
+++ Frameworks/CoreObject/COObject.m	(working copy)
@@ -344,9 +344,9 @@
 /** <p>Returns the properties published by the receiver and accessible through 
     <em>Property Value Coding</em>. The returned array includes the properties 
     inherited from the superclass too, see -[NSObject properties].</p> */
-- (NSArray *) properties
+- (NSArray *) propertyNames
 {
-	return [[super properties] arrayByAddingObjectsFromArray: [[self class] properties]];
+	return [[self class] properties];
 }
 
 /** <p></p> */
Index: Frameworks/EtoileUI/CoreObjectBackend/COUIServer.m
===================================================================
--- Frameworks/EtoileUI/CoreObjectBackend/COUIServer.m	(revision 4772)
+++ Frameworks/EtoileUI/CoreObjectBackend/COUIServer.m	(working copy)
@@ -220,7 +220,7 @@
 	return [NSArray array];
 }
 
-- (NSArray *) properties
+- (NSArray *) propertyNames
 {
 	return [NSArray array]; // FIXME
 }
Index: Frameworks/EtoileUI/Source/NSView+Etoile.m
===================================================================
--- Frameworks/EtoileUI/Source/NSView+Etoile.m	(revision 4772)
+++ Frameworks/EtoileUI/Source/NSView+Etoile.m	(working copy)
@@ -303,10 +303,10 @@
 
 /* Property Value Coding */
 
-- (NSArray *) properties
+- (NSArray *) propertyNames
 {
 	// TODO: Expose more properties
-	NSArray *properties = [NSArray arrayWithObjects: @"x", @"y", @"width", 
+	return [NSArray arrayWithObjects: @"x", @"y", @"width", 
 		@"height", @"superview", @"window", @"tag", @"hidden", 
 		@"autoresizingMask", @"autoresizesSubviews", @"subviews", @"flipped", 
 		@"frame", @"frameRotation", @"bounds", @"boundsRotation", @"isRotatedFromBase", 
@@ -316,8 +316,6 @@
 		@"canDraw",  @"shouldDrawColor", @"widthAdjustLimit",
 		@"heightAdjustLimit", @"printJobTitle", @"mouseDownCanMoveWindow", 
 		@"needsPanelToBecomeKey", nil]; 
-	
-	return [[super properties] arrayByAddingObjectsFromArray: properties];
 }
 
 /* Basic Properties */
Index: Frameworks/EtoileUI/Source/ETLayoutItem+Reflection.m
===================================================================
--- Frameworks/EtoileUI/Source/ETLayoutItem+Reflection.m	(revision 4772)
+++ Frameworks/EtoileUI/Source/ETLayoutItem+Reflection.m	(working copy)
@@ -123,7 +123,7 @@
 	   meta levels 1 or 2.
 	*/
 	// NOTE: this code may be better located in -[ETLayoutItem valueForProperty:]
-	if ([[item properties] containsObject: @"property"])
+	if ([[item allPropertyNames] containsObject: @"property"])
 	{
 		propertyName = [metaLayoutItem valueForProperty: @"property"];
 		if (propertyName != nil)
Index: Frameworks/EtoileUI/Source/ETLayoutItem.m
===================================================================
--- Frameworks/EtoileUI/Source/ETLayoutItem.m	(revision 4772)
+++ Frameworks/EtoileUI/Source/ETLayoutItem.m	(working copy)
@@ -801,7 +801,7 @@
 
 	/* Basic version which doesn't fetch property value beyond the represented 
 	   object, even if this represented object represents another object too. */
-	if (modelObject != nil && [[(NSObject *)modelObject properties] containsObject: key])
+	if (modelObject != nil && [[(NSObject *)modelObject allPropertyNames] containsObject: key])
 	{
 		if ([modelObject isLayoutItem])
 		{
@@ -834,7 +834,7 @@
 
 	/* Basic version which doesn't propagate property editing beyond the represented 
 	   object, even if this represented object represents another object too. */
-	if (modelObject != nil && [[(NSObject *)modelObject properties] containsObject: key])
+	if (modelObject != nil && [[(NSObject *)modelObject allPropertyNames] containsObject: key])
 	{
 		if ([modelObject isLayoutItem])
 		{
@@ -859,7 +859,7 @@
 	return result;
 }
 
-- (NSArray *) properties
+- (NSArray *) propertyNames
 {
 	NSArray *properties = A(@"identifier", kETNameProperty, @"x", @"y", @"width", 
 		@"height", @"view", kETSelectedProperty, kETLayoutProperty,
@@ -870,7 +870,7 @@
 
 	properties = [[VARIABLE_PROPERTIES allKeys] arrayByAddingObjectsFromArray: properties];
 		
-	return [[super properties] arrayByAddingObjectsFromArray: properties];
+	return properties;
 }
 
 /* Returns a dictionary representation of every property/value pairs not stored 
Index: Frameworks/EtoileUI/Source/ETViewModelLayout.m
===================================================================
--- Frameworks/EtoileUI/Source/ETViewModelLayout.m	(revision 4772)
+++ Frameworks/EtoileUI/Source/ETViewModelLayout.m	(working copy)
@@ -291,11 +291,11 @@
 		   object) of the meta item. 
 		   See -[ETLayoutItem properties] to know which ivars/accessors are 
 		   reified into properties. */
-		nbOfItems = [[metaItem properties] count];
+		nbOfItems = [[metaItem allPropertyNames] count];
 	}
 	else if ([self displayMode] == ETLayoutDisplayModeModelProperties)
 	{
-		nbOfItems = [[inspectedModel properties] count];
+		nbOfItems = [[inspectedModel allPropertyNames] count];
 	}
 	else if ([self displayMode] == ETLayoutDisplayModeViewContent)
 	{
@@ -347,7 +347,7 @@
 	
 	if ([self displayMode] == ETLayoutDisplayModeViewProperties)
 	{
-		NSString *property = [[metaItem properties] objectAtIndex: index];
+		NSString *property = [[metaItem allPropertyNames] objectAtIndex: index];
 
 		[propertyItem setValue: property forProperty: @"property"];
 		// FIXME: Instead using -description, write a generic ETObjectFormatter
@@ -360,7 +360,7 @@
 	}
 	else if ([self displayMode] == ETLayoutDisplayModeModelProperties)
 	{
-		NSString *property = [(NSArray *)[inspectedModel properties] objectAtIndex: index];
+		NSString *property = [(NSArray *)[inspectedModel allPropertyNames] objectAtIndex: index];
 
 		[propertyItem setValue: property forProperty: @"property"];
 		[propertyItem setValue: [inspectedModel valueForProperty: property] forProperty: @"value"];
Index: Frameworks/EtoileUI/Source/ETObjectBrowserLayout.m
===================================================================
--- Frameworks/EtoileUI/Source/ETObjectBrowserLayout.m	(revision 4772)
+++ Frameworks/EtoileUI/Source/ETObjectBrowserLayout.m	(working copy)
@@ -245,7 +245,7 @@
 	if ([self browsedObject] == nil)
 		return [NSArray array];
 
-	return [(NSObject *)[self browsedObject] properties];
+	return [(NSObject *)[self browsedObject] allPropertyNames];
 }
 
 @end
Index: Frameworks/EtoileUI/Source/ETLayoutItemGroup.m
===================================================================
--- Frameworks/EtoileUI/Source/ETLayoutItemGroup.m	(revision 4772)
+++ Frameworks/EtoileUI/Source/ETLayoutItemGroup.m	(working copy)
@@ -240,12 +240,10 @@
 
 /* Property Value Coding */
 
-- (NSArray *) properties
+- (NSArray *) propertyNames
 {
-	NSArray *properties = A(kSourceProperty, kDelegateProperty, 
+	return A(kSourceProperty, kDelegateProperty, 
 		kETDoubleClickedItemProperty);
-
-	return [[super properties] arrayByAddingObjectsFromArray: properties];
 }
 
 /* Finding Container */
Index: Frameworks/EtoileUI/Source/ETView.m
===================================================================
--- Frameworks/EtoileUI/Source/ETView.m	(revision 4772)
+++ Frameworks/EtoileUI/Source/ETView.m	(working copy)
@@ -650,7 +650,7 @@
 {
 	id value = nil;
 
-	if ([[self properties] containsObject: key])
+	if ([[self allPropertyNames] containsObject: key])
 		value = [self valueForKey: key];
 		
 	if (value == nil)
@@ -661,7 +661,7 @@
 
 - (BOOL) setValue: (id)value forProperty: (NSString *)key
 {
-	if ([[self properties] containsObject: key])
+	if ([[self allPropertyNames] containsObject: key])
 	{
 		[self setValue: value forKey: key];
 		return YES;
@@ -674,12 +674,10 @@
 	}
 }
 
-- (NSArray *) properties
+- (NSArray *) propertyNames
 {
 	// NOTE: We may expose other properties in future
-	id properties = [NSArray arrayWithObjects: @"disclosable", nil];
-	
-	return [[super properties] arrayByAddingObjectsFromArray: properties];
+	return [NSArray arrayWithObjects: @"disclosable", nil];
 }
 
 /* Live Development */
Index: Frameworks/EtoileUI/Source/Controls+Etoile.m
===================================================================
--- Frameworks/EtoileUI/Source/Controls+Etoile.m	(revision 4772)
+++ Frameworks/EtoileUI/Source/Controls+Etoile.m	(working copy)
@@ -72,17 +72,15 @@
 
 /* Property Value Coding */
 
-- (NSArray *) properties
+- (NSArray *) propertyNames
 {
 	// NOTE: objectValue property is exposed by NSObject+Model
 	// TODO: selectedTag, selectedCell and currentEditor are read only. 
 	// Eventually expose cellClass as class property.
-	NSArray *properties = [NSArray arrayWithObjects: @"cell", @"enabled", 
+	return [NSArray arrayWithObjects: @"cell", @"enabled", 
 		@"selectedTag", @"selectedCell", @"alignement", @"font", @"formatter", 
 		@"baseWritingDirection", @"currentEditor", @"target", @"action", 
 		@"continuous", @"tag",@"refusesFirstResponder", @"ignoresMultiClick", nil]; 
-	
-	return [[super properties] arrayByAddingObjectsFromArray: properties];
 }
 @end
 
@@ -96,12 +94,10 @@
 	return NSMakeRect(0, 0, 96, 22);
 }
 
-- (NSArray *) properties
+- (NSArray *) propertyNames
 {
 	// TODO: Declare properties.
-	NSArray *properties = [NSArray array]; 
-	
-	return [[super properties] arrayByAddingObjectsFromArray: properties];
+	return [NSArray array]; 
 }
 
 @end
Index: Frameworks/EtoileUI/Source/ETInspector.m
===================================================================
--- Frameworks/EtoileUI/Source/ETInspector.m	(revision 4772)
+++ Frameworks/EtoileUI/Source/ETInspector.m	(working copy)
@@ -199,9 +199,9 @@
 	{
 		item = [item representedObject];
 		
-		NSAssert([item properties] != nil, @"Represented object of a layout item should never be nil");
+		NSAssert([item allPropertyNames] != nil, @"Represented object of a layout item should never be nil");
 		#if 1
-		nbOfPropertyItems = [[item properties] count];
+		nbOfPropertyItems = [[item allPropertyNames] count];
 		#else
 		
 		NSArray *ivars = [[item representedObject] instanceVariables];
@@ -225,12 +225,12 @@
 	int index = [path lastIndex];
 	
 #if 1
-	NSString *property = [[item properties] objectAtIndex: index];
+	NSString *property = [[item allPropertyNames] objectAtIndex: index];
 	ETProperty *propertyRep = [ETProperty propertyWithName: property representedObject: item];
 	
 	[propertyItem setRepresentedObject: propertyRep];
 #else
-	NSString *property = [[item properties] objectAtIndex: index];
+	NSString *property = [[item allPropertyNames] objectAtIndex: index];
 
 	[propertyItem setValue: property forProperty: @"property"];
 	// FIXME: Instead using -description, write a generic ETObjectFormatter
Index: Frameworks/EtoileUI/Source/ETOutlineLayout.m
===================================================================
--- Frameworks/EtoileUI/Source/ETOutlineLayout.m	(revision 4772)
+++ Frameworks/EtoileUI/Source/ETOutlineLayout.m	(working copy)
@@ -315,7 +315,7 @@
 
 	/* Report nil value for debugging */
 	if (value == nil || ([value isEqual: [NSNull null]]
-	 && [[(NSObject *)item properties] containsObject: [column identifier]] == NO))
+	 && [[(NSObject *)item allPropertyNames] containsObject: [column identifier]] == NO))
 	{
 		// FIXME: Turn into an ETDebugLog
 		ETDebugLog(@"Item %@ has no property %@ requested by layout %@", item, 
Index: Frameworks/EtoileUI/Headers/ETLayoutItem.h
===================================================================
--- Frameworks/EtoileUI/Headers/ETLayoutItem.h	(revision 4772)
+++ Frameworks/EtoileUI/Headers/ETLayoutItem.h	(working copy)
@@ -180,7 +180,7 @@
 
 - (id) valueForProperty: (NSString *)key;
 - (BOOL) setValue: (id)value forProperty: (NSString *)key;
-- (NSArray *) properties;
+- (NSArray *) propertyNames;
 - (NSDictionary *) variableProperties;
 
 - (unsigned int) UIMetalevel;
Index: Frameworks/EtoileUI/Headers/ETView.h
===================================================================
--- Frameworks/EtoileUI/Headers/ETView.h	(revision 4772)
+++ Frameworks/EtoileUI/Headers/ETView.h	(working copy)
@@ -162,7 +162,7 @@
 
 - (id) valueForProperty: (NSString *)key;
 - (BOOL) setValue: (id)value forProperty: (NSString *)key;
-- (NSArray *) properties;
+- (NSArray *) propertyNames;
 
 /* Live Development */
 
Index: Frameworks/EtoileUI/Headers/Controls+Etoile.h
===================================================================
--- Frameworks/EtoileUI/Headers/Controls+Etoile.h	(revision 4772)
+++ Frameworks/EtoileUI/Headers/Controls+Etoile.h	(working copy)
@@ -50,14 +50,14 @@
 
 /* Property Value Coding */
 
-- (NSArray *) properties;
+- (NSArray *) propertyNames;
 
 @end
 
 
 @interface NSTextField (Etoile)
 + (NSRect) defaultFrame;
-- (NSArray *) properties;
+- (NSArray *) propertyNames;
 @end
 
 @interface NSImageView (Etoile)
Index: Frameworks/EtoileUI/Headers/NSView+Etoile.h
===================================================================
--- Frameworks/EtoileUI/Headers/NSView+Etoile.h	(revision 4772)
+++ Frameworks/EtoileUI/Headers/NSView+Etoile.h	(working copy)
@@ -81,7 +81,7 @@
 
 /* Property Value Coding */
 
-- (NSArray *) properties;
+- (NSArray *) propertyNames;
 
 /* Basic Properties */
 
Index: Frameworks/EtoileFoundation/Source/NSObject+Model.m
===================================================================
--- Frameworks/EtoileFoundation/Source/NSObject+Model.m	(revision 4772)
+++ Frameworks/EtoileFoundation/Source/NSObject+Model.m	(working copy)
@@ -209,7 +209,7 @@
 
 /* Property Value Coding */
 
-- (NSArray *) properties
+- (NSArray *) propertyNames
 {
 	return [NSArray arrayWithObjects: @"icon", @"displayName", @"className", 
 		@"stringValue", @"objectValue", @"isCollection", @"isGroup", 
@@ -222,7 +222,7 @@
 {
 	id value = nil;
 	
-	if ([[self properties] containsObject: key])
+	if ([[self allPropertyNames] containsObject: key])
 	{
 		value = [self primitiveValueForKey: key];
 	}
@@ -242,7 +242,7 @@
 {
 	BOOL result = NO;
 	
-	if ([[self properties] containsObject: key])
+	if ([[self allPropertyNames] containsObject: key])
 	{
 		[self setPrimitiveValue: value forKey: key];
 		result = YES;
@@ -262,6 +262,7 @@
 
 /* Key Value Coding */
 
+// FIXME: Why are these static?
 static id (*valueForKeyIMP)(id, SEL, NSString *) = NULL;
 static void (*setValueForKeyIMP)(id, SEL, id, NSString *) = NULL;
 
@@ -424,7 +425,7 @@
 
 /* Property Value Coding */
 
-- (NSArray *) properties
+- (NSArray *) propertyNames
 {
 	return [NSArray arrayWithObjects: @"property", @"name", @"value", nil];
 }
@@ -433,7 +434,7 @@
 {
 	id value = nil;
 	
-	if ([[self properties] containsObject: key])
+	if ([[self allPropertyNames] containsObject: key])
 	{
 		if ([key isEqual: @"value"])
 		{
@@ -456,7 +457,7 @@
 {
 	BOOL result = NO;
 	
-	if ([[self properties] containsObject: key])
+	if ([[self allPropertyNames] containsObject: key])
 	{
 		// NOTE: name, type are read-only properties
 		if ([key isEqual: @"value"])
Index: Frameworks/EtoileFoundation/Source/NSObject+Etoile.m
===================================================================
--- Frameworks/EtoileFoundation/Source/NSObject+Etoile.m	(revision 4772)
+++ Frameworks/EtoileFoundation/Source/NSObject+Etoile.m	(working copy)
@@ -597,7 +597,7 @@
 #endif
 }
 
-- (NSArray *) properties
+- (NSArray *) propertyNames
 {
 	return A(@"possessor", @"name", @"type", @"typeName", @"typeEncoding", 
 		@"isObjectType", @"value");
Index: Frameworks/EtoileFoundation/Source/ETPropertyValueCoding.m
===================================================================
--- Frameworks/EtoileFoundation/Source/ETPropertyValueCoding.m	(revision 4772)
+++ Frameworks/EtoileFoundation/Source/ETPropertyValueCoding.m	(working copy)
@@ -40,7 +40,24 @@
 #import <EtoileFoundation/NSObject+Model.h>
 #import <EtoileFoundation/EtoileCompatibility.h>
 
+...@implementation NSObject (ETPropertyValueCoding)
 
+- (NSArray *) allPropertyNames
+{
+	NSMutableArray *properties = [[self propertyNames] mutableCopy];
+	for (Class c = [self superclass]; c != Nil; c = [c superclass])
+	{
+		id (*propertyNamesIMP)(id, SEL) =
+			(id (*)(id, SEL))[c instanceMethodForSelector: @selector(propertyNames)];
+
+		[properties addObjectsFromArray:
+			propertyNamesIMP(self, @selector(propertyNames))];
+	}
+	return properties;
+}
+
+...@end
+
 @implementation NSDictionary (ETPropertyValueCoding)
 #if 0
 - (NSArray *) properties
@@ -59,19 +76,17 @@
 }
 #else
 
-- (NSArray *) properties
+- (NSArray *) propertyNames
 {
-	NSArray *properties = [NSArray arrayWithObjects: @"count", @"firstObject", 
-		@"lastObject", nil];
-	
-	return [[super properties] arrayByAddingObjectsFromArray: properties];
+	return [NSArray arrayWithObjects: @"count", @"firstObject", @"lastObject",
+		nil];
 }
 
 - (id) valueForProperty: (NSString *)key
 {
 	id value = nil;
 	
-	if ([[self properties] containsObject: key])
+	if ([[self allPropertyNames] containsObject: key])
 	{
 		id (*NSObjectValueForKeyIMP)(id, SEL, id) = NULL;
 		
@@ -95,7 +110,7 @@
 {
 	BOOL result = YES;
 	
-	if ([[self properties] containsObject: key])
+	if ([[self allPropertyNames] containsObject: key])
 	{
 		void (*NSObjectSetValueForKeyIMP)(id, SEL, id, id) = NULL;
 		
@@ -142,17 +157,15 @@
 
 @implementation NSArray (ETPropertyValueCoding)
 
-- (NSArray *) properties
+- (NSArray *) propertyNames
 {
-	NSArray *properties = [NSArray arrayWithObjects: @"count", @"firstObject", 
-		@"lastObject", nil];
-	
-	return [[super properties] arrayByAddingObjectsFromArray: properties];
+	return [NSArray arrayWithObjects: @"count", @"firstObject", @"lastObject",
+		nil];
 }
 
 - (id) valueForProperty: (NSString *)key
 {
-	if ([[self properties] containsObject: key])
+	if ([[self allPropertyNames] containsObject: key])
 	{
 		id (*NSObjectValueForKeyIMP)(id, SEL, id) = NULL;
 		
@@ -184,7 +197,7 @@
 {
 	BOOL result = YES;
 
-	if ([[self properties] containsObject: key])
+	if ([[self allPropertyNames] containsObject: key])
 	{
 		void (*NSObjectSetValueForKeyIMP)(id, SEL, id, id) = NULL;
 		
Index: Frameworks/EtoileFoundation/Headers/ETPropertyValueCoding.h
===================================================================
--- Frameworks/EtoileFoundation/Headers/ETPropertyValueCoding.h	(revision 4772)
+++ Frameworks/EtoileFoundation/Headers/ETPropertyValueCoding.h	(working copy)
@@ -37,17 +37,27 @@
 
 #import <Foundation/Foundation.h>
 
-
 /** Protocol usually adopted by model objects */
 @protocol ETPropertyValueCoding
-- (NSArray *) properties;
+/**
+ * Returns the names of properties this object has, not including properties
+ * declared by superclasses of this object's class.
+ */
+- (NSArray *) propertyNames;
 - (id) valueForProperty: (NSString *)key;
 - (BOOL) setValue: (id)value forProperty: (NSString *)key;
 @end
 
+...@interface NSObject (ETPropertyValueCoding)
+/**
+ * Returns the names of all properties this object has, including properties
+ * declared by superclasses of this object's class.
+ */
+- (NSArray *) allPropertyNames;
+...@end
 
-...@interface NSDictionary (ETPropertyValueCoding) <ETPropertyValueCoding>
-- (NSArray *) properties;
+...@interface NSDictionary (ETPropertyValueCoding)
+- (NSArray *) propertyNames;
 - (id) valueForProperty: (NSString *)key;
 - (BOOL) setValue: (id)value forProperty: (NSString *)key;
 @end
Index: Frameworks/EtoileFoundation/Headers/NSObject+Model.h
===================================================================
--- Frameworks/EtoileFoundation/Headers/NSObject+Model.h	(revision 4772)
+++ Frameworks/EtoileFoundation/Headers/NSObject+Model.h	(working copy)
@@ -36,7 +36,6 @@
 #import <Foundation/Foundation.h>
 #import <EtoileFoundation/ETPropertyValueCoding.h>
 
-
 @interface NSObject (EtoileModel)
 
 + (id) objectWithObjectValue: (id)object;
@@ -54,7 +53,7 @@
 
 /* Property Value Coding */
 
-- (NSArray *) properties;
+- (NSArray *) propertyNames;
 - (id) valueForProperty: (NSString *)key;
 - (BOOL) setValue: (id)value forProperty: (NSString *)key;
 
@@ -94,7 +93,7 @@
 
 
 /** Property Representation */
-...@interface ETProperty : NSObject <ETPropertyValueCoding>
+...@interface ETProperty : NSObject
 {
 	id _propertyOwner;
 	id _propertyName;
@@ -117,7 +116,7 @@
 
 /* Property Value Coding */
 
-- (NSArray *) properties;
+- (NSArray *) propertyNames;
 - (id) valueForProperty: (NSString *)key;
 - (BOOL) setValue: (id)value forProperty: (NSString *)key;
 
_______________________________________________
Etoile-dev mailing list
[email protected]
https://mail.gna.org/listinfo/etoile-dev

Reply via email to