+- (IMP)implementationForSelector:(SEL)selector {
+@synchronized (self) {
+ /* XXX: this is an unsafe optimization of doomy hell */
+ Method method(class_getInstanceMethod([Package class], selector));
+ _assert(method != NULL);
+ IMP imp = method_getImplementation(method);
+ _assert(imp != NULL);
+
+ return imp;
+} }
+
+- (PackageListFilter)packageListFilterForFilter:(NSString *)filter {
+ return [[filters_ objectForKey:filter] packageListFilterValue];
+}
+
+- (void)setPackageListFilter:(PackageListFilter)filter forFilter:(NSString *)filterName {
+ [filters_ setObject:[NSValue valueWithPackageListFilter:filter] forKey:filterName];
+}
+
+- (id)objectForFilter:(NSString *)filter {
+ return [self packageListFilterForFilter:filter].object;
+}
+
+- (SEL)selectorForFilter:(NSString *)filter {
+ return [self packageListFilterForFilter:filter].selector;
+}
+
+- (IMP)implementationForFilter:(NSString *)filter {
+ return [self packageListFilterForFilter:filter].implementation;
+}
+
+- (PackageListFilterPriority)priorityForFilter:(NSString *)filter {
+ return [self packageListFilterForFilter:filter].priority;
+}
+
+- (void)setObject:(id)object forFilter:(NSString *)filterName {
+ PackageListFilter filter = [self packageListFilterForFilter:filterName];
+ filter.object = object;
+ [self setPackageListFilter:filter forFilter:filterName];
+}
+
+- (void)setPriority:(PackageListFilterPriority)priority forFilter:(NSString *)filterName {
+ PackageListFilter filter = [self packageListFilterForFilter:filterName];
+ filter.priority = priority;
+ [self setPackageListFilter:filter forFilter:filterName];
+}
+
+- (void)setImplementation:(IMP)implementation forFilter:(NSString *)filterName {
+ PackageListFilter filter = [self packageListFilterForFilter:filterName];
+ filter.implementation = implementation;
+ [self setPackageListFilter:filter forFilter:filterName];
+}
+
+- (void)setSelector:(SEL)selector forFilter:(NSString *)filterName {
+ PackageListFilter filter = [self packageListFilterForFilter:filterName];
+ filter.selector = selector;
+ [self setPackageListFilter:filter forFilter:filterName];
+
+ [self setImplementation:[self implementationForSelector:selector] forFilter:filterName];
+}
+
+- (void)addFilter:(NSString *)filterName {
+ PackageListFilter filter;
+ filter.object = nil;
+ filter.selector = NULL;
+ filter.implementation = NULL;
+ filter.priority = kPackageListFilterPriorityNormal;
+
+ [self setPackageListFilter:filter forFilter:filterName];
+}
+
+- (void)addFilter:(NSString *)filter withSelector:(SEL)selector {
+ [self addFilter:filter];
+ [self setSelector:selector forFilter:filter];
+}
+
+- (void)addFilter:(NSString *)filter withSelector:(SEL)selector priority:(PackageListFilterPriority)priority {
+ [self addFilter:filter withSelector:selector];
+ [self setPriority:priority forFilter:filter];
+}
+
+- (void)addFilter:(NSString *)filter withSelector:(SEL)selector priority:(PackageListFilterPriority)priority object:(id)object {
+ [self addFilter:filter withSelector:selector];
+ [self setObject:object forFilter:filter];
+}
+
+- (void)removeFilter:(NSString *)filter {
+ [filters_ removeObjectForKey:filter];
+}
+