KWMatchers.m 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. //
  2. // KWMatchers.m
  3. // Kiwi
  4. //
  5. // Created by Luke Redpath on 17/06/2011.
  6. // Copyright 2011 Allen Ding. All rights reserved.
  7. //
  8. #import "KWMatchers.h"
  9. #import "KWUserDefinedMatcher.h"
  10. @interface KWMatchers() {
  11. NSMutableDictionary *userDefinedMatchers;
  12. }
  13. @end
  14. @implementation KWMatchers
  15. #pragma mark - Singleton implementation
  16. static id sharedMatchers = nil;
  17. + (void)initialize {
  18. if (self == [KWMatchers class]) {
  19. sharedMatchers = [[self alloc] init];
  20. }
  21. }
  22. + (id)matchers {
  23. return sharedMatchers;
  24. }
  25. - (id)init {
  26. self = [super init];
  27. if (self) {
  28. userDefinedMatchers = [[NSMutableDictionary alloc] init];
  29. }
  30. return self;
  31. }
  32. #pragma mark - Defining Matchers
  33. + (void)defineMatcher:(NSString *)selectorString as:(KWMatchersBuildingBlock)block {
  34. [[self matchers] defineMatcher:selectorString as:block];
  35. }
  36. - (void)defineMatcher:(NSString *)selectorString as:(KWMatchersBuildingBlock)block {
  37. KWUserDefinedMatcherBuilder *builder = [KWUserDefinedMatcherBuilder builderForSelector:NSSelectorFromString(selectorString)];
  38. block(builder);
  39. userDefinedMatchers[builder.key] = builder;
  40. }
  41. - (void)addUserDefinedMatcherBuilder:(KWUserDefinedMatcherBuilder *)builder {
  42. userDefinedMatchers[builder.key] = builder;
  43. }
  44. #pragma mark - Building Matchers
  45. - (KWUserDefinedMatcher *)matcherForSelector:(SEL)selector subject:(id)subject {
  46. KWUserDefinedMatcherBuilder *builder = userDefinedMatchers[NSStringFromSelector(selector)];
  47. if (builder == nil)
  48. return nil;
  49. return [builder buildMatcherWithSubject:subject];
  50. }
  51. @end
  52. void KWDefineMatchers(NSString *selectorString, KWMatchersBuildingBlock block)
  53. {
  54. [KWMatchers defineMatcher:selectorString as:block];
  55. }