+@interface Diversion : NSObject {
+ Pcre pattern_;
+ _H<NSString> key_;
+ _H<NSString> format_;
+}
+
+@end
+
+@implementation Diversion
+
+- (id) initWithFrom:(NSString *)from to:(NSString *)to {
+ if ((self = [super init]) != nil) {
+ pattern_ = [from UTF8String];
+ key_ = from;
+ format_ = to;
+ } return self;
+}
+
+- (NSString *) divert:(NSString *)url {
+ if (!pattern_(url))
+ return nil;
+
+ size_t count(pattern_.size());
+ id values[count];
+ for (size_t i(0); i != count; ++i)
+ values[i] = pattern_[i + 1];
+
+ return [[[NSString alloc] initWithFormat:format_ arguments:reinterpret_cast<va_list>(values)] autorelease];
+}
+
+- (NSString *) key {
+ return key_;
+}
+
+- (NSUInteger) hash {
+ return [key_ hash];
+}
+
+- (BOOL) isEqual:(Diversion *)object {
+ return self == object || [self class] == [object class] && [key_ isEqual:[object key]];
+}
+
+@end
+