+/* accessors */
+
+- (NSURL *)tableURL {
+ return self->url;
+}
+- (NSString *)uid {
+ return self->uid;
+}
+
+- (NSUserDefaults *)parentDefaults {
+ return self->parent;
+}
+
+/* operation */
+
+- (BOOL)fill {
+ GCSChannelManager *cm;
+ EOAdaptorChannel *channel;
+
+ cm = [GCSChannelManager defaultChannelManager];
+ if ((channel = [cm acquireOpenChannelForURL:[self tableURL]]) == nil) {
+ [self errorWithFormat:@"failed to acquire channel for URL: %@",
+ [self tableURL]];
+ return NO;
+ }
+
+ [self logWithFormat:@"do work on: %@", channel];
+
+ [cm releaseChannel:channel];
+ return YES;
+}
+
+/* value access */
+
+- (void)setObject:(id)_value forKey:(NSString *)_key {
+ [self logWithFormat:@"TODO(%s): %@", __PRETTY_FUNCTION__, _key];
+}
+- (id)objectForKey:(NSString *)_key {
+ [self logWithFormat:@"TODO(%s): %@", __PRETTY_FUNCTION__, _key];
+ [self fill];
+ return nil;
+}
+
+- (void)removeObjectForKey:(NSString *)_key {
+ [self setObject:nil forKey:_key];
+}
+
+/* typed accessors */
+
+- (NSArray *)arrayForKey:(NSString *)_key {
+ id obj = [self objectForKey:_key];
+ return [obj isKindOfClass:[NSArray class]] ? obj : nil;
+}
+
+- (NSDictionary *)dictionaryForKey:(NSString *)_key {
+ id obj = [self objectForKey:_key];
+ return [obj isKindOfClass:[NSDictionary class]] ? obj : nil;
+}
+
+- (NSData *)dataForKey:(NSString *)_key {
+ id obj = [self objectForKey:_key];
+ return [obj isKindOfClass:[NSData class]] ? obj : nil;
+}
+
+- (NSArray *)stringArrayForKey:(NSString *)_key {
+ id obj = [self objectForKey:_key];
+ int n;
+ Class strClass = [NSString class];
+
+ if (![obj isKindOfClass:[NSArray class]])
+ return nil;
+
+ for (n = [obj count]-1; n >= 0; n--) {
+ if (![[obj objectAtIndex:n] isKindOfClass:strClass])
+ return nil;
+ }
+ return obj;
+}
+
+- (NSString *)stringForKey:(NSString *)_key {
+ id obj = [self objectForKey:_key];
+ return [obj isKindOfClass:[NSString class]] ? obj : nil;
+}
+
+- (BOOL)boolForKey:(NSString *)_key {
+ id obj;
+
+ if ((obj = [self objectForKey:_key]) == nil)
+ return NO;
+ if ([obj isKindOfClass:[NSString class]]) {
+ if ([obj compare:@"YES" options:NSCaseInsensitiveSearch] == NSOrderedSame)
+ return YES;
+ }
+ if ([obj respondsToSelector:@selector(intValue)])
+ return [obj intValue] ? YES : NO;
+ return NO;
+}
+
+- (float)floatForKey:(NSString *)_key {
+ id obj = [self stringForKey:_key];
+ return (obj != nil) ? [obj floatValue] : 0.0;
+}
+- (int)integerForKey:(NSString *)_key {
+ id obj = [self stringForKey:_key];
+ return (obj != nil) ? [obj intValue] : 0;
+}
+
+- (void)setBool:(BOOL)value forKey:(NSString *)_key {
+ [self setObject:(value ? @"YES" : @"NO") forKey:_key];
+}
+- (void)setFloat:(float)value forKey:(NSString *)_key {
+ [self setObject:[NSString stringWithFormat:@"%f", value] forKey:_key];
+}
+- (void)setInteger:(int)value forKey:(NSString *)_key {
+ [self setObject:[NSString stringWithFormat:@"%d", value] forKey:_key];
+}
+
+/* description */
+
+- (NSString *)description {
+ NSMutableString *ms;
+
+ ms = [NSMutableString stringWithCapacity:16];
+ [ms appendFormat:@"<0x%08X[%@]>", self, NSStringFromClass([self class])];
+ [ms appendFormat:@" uid=%@", self->uid];
+ [ms appendFormat:@" url=%@", [self->url absoluteString]];
+ [ms appendFormat:@" parent=0x%08X", self->parent];
+ [ms appendString:@">"];
+ return ms;
+}
+