Commit a84c5f9

mo khan <mo@mokhan.ca>
2013-05-15 01:10:42
install kiwi'
1 parent b5c0076
Changed files (374)
MovieLibrary.xcodeproj
MovieLibrary.xcworkspace
Pods
BuildHeaders
Kiwi
Headers
Kiwi
Kiwi
Classes
Pods.xcodeproj
MovieLibrary.xcodeproj/project.pbxproj
@@ -1,450 +1,1037 @@
-// !$*UTF8*$!
-{
-	archiveVersion = 1;
-	classes = {
-	};
-	objectVersion = 46;
-	objects = {
-
-/* Begin PBXBuildFile section */
-		CD7ADE49174315F400B5B281 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CD7ADE48174315F400B5B281 /* UIKit.framework */; };
-		CD7ADE4B174315F400B5B281 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CD7ADE4A174315F400B5B281 /* Foundation.framework */; };
-		CD7ADE4D174315F400B5B281 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CD7ADE4C174315F400B5B281 /* CoreGraphics.framework */; };
-		CD7ADE53174315F400B5B281 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = CD7ADE51174315F400B5B281 /* InfoPlist.strings */; };
-		CD7ADE55174315F400B5B281 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = CD7ADE54174315F400B5B281 /* main.m */; };
-		CD7ADE59174315F400B5B281 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = CD7ADE58174315F400B5B281 /* AppDelegate.m */; };
-		CD7ADE5B174315F400B5B281 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = CD7ADE5A174315F400B5B281 /* Default.png */; };
-		CD7ADE5D174315F400B5B281 /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = CD7ADE5C174315F400B5B281 /* Default@2x.png */; };
-		CD7ADE5F174315F400B5B281 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = CD7ADE5E174315F400B5B281 /* Default-568h@2x.png */; };
-		CD7ADE67174315F400B5B281 /* SenTestingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CD7ADE66174315F400B5B281 /* SenTestingKit.framework */; };
-		CD7ADE68174315F400B5B281 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CD7ADE48174315F400B5B281 /* UIKit.framework */; };
-		CD7ADE69174315F400B5B281 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CD7ADE4A174315F400B5B281 /* Foundation.framework */; };
-		CD7ADE71174315F400B5B281 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = CD7ADE6F174315F400B5B281 /* InfoPlist.strings */; };
-		CD7ADE74174315F400B5B281 /* MovieLibraryTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CD7ADE73174315F400B5B281 /* MovieLibraryTests.m */; };
-/* End PBXBuildFile section */
-
-/* Begin PBXContainerItemProxy section */
-		CD7ADE6A174315F400B5B281 /* PBXContainerItemProxy */ = {
-			isa = PBXContainerItemProxy;
-			containerPortal = CD7ADE3D174315F400B5B281 /* Project object */;
-			proxyType = 1;
-			remoteGlobalIDString = CD7ADE44174315F400B5B281;
-			remoteInfo = MovieLibrary;
-		};
-/* End PBXContainerItemProxy section */
-
-/* Begin PBXFileReference section */
-		CD7ADE45174315F400B5B281 /* MovieLibrary.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MovieLibrary.app; sourceTree = BUILT_PRODUCTS_DIR; };
-		CD7ADE48174315F400B5B281 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
-		CD7ADE4A174315F400B5B281 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
-		CD7ADE4C174315F400B5B281 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
-		CD7ADE50174315F400B5B281 /* MovieLibrary-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "MovieLibrary-Info.plist"; sourceTree = "<group>"; };
-		CD7ADE52174315F400B5B281 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
-		CD7ADE54174315F400B5B281 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
-		CD7ADE56174315F400B5B281 /* MovieLibrary-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "MovieLibrary-Prefix.pch"; sourceTree = "<group>"; };
-		CD7ADE57174315F400B5B281 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
-		CD7ADE58174315F400B5B281 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
-		CD7ADE5A174315F400B5B281 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = "<group>"; };
-		CD7ADE5C174315F400B5B281 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default@2x.png"; sourceTree = "<group>"; };
-		CD7ADE5E174315F400B5B281 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = "<group>"; };
-		CD7ADE65174315F400B5B281 /* MovieLibraryTests.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MovieLibraryTests.octest; sourceTree = BUILT_PRODUCTS_DIR; };
-		CD7ADE66174315F400B5B281 /* SenTestingKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SenTestingKit.framework; path = Library/Frameworks/SenTestingKit.framework; sourceTree = DEVELOPER_DIR; };
-		CD7ADE6E174315F400B5B281 /* MovieLibraryTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "MovieLibraryTests-Info.plist"; sourceTree = "<group>"; };
-		CD7ADE70174315F400B5B281 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
-		CD7ADE72174315F400B5B281 /* MovieLibraryTests.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MovieLibraryTests.h; sourceTree = "<group>"; };
-		CD7ADE73174315F400B5B281 /* MovieLibraryTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MovieLibraryTests.m; sourceTree = "<group>"; };
-/* End PBXFileReference section */
-
-/* Begin PBXFrameworksBuildPhase section */
-		CD7ADE42174315F400B5B281 /* Frameworks */ = {
-			isa = PBXFrameworksBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				CD7ADE49174315F400B5B281 /* UIKit.framework in Frameworks */,
-				CD7ADE4B174315F400B5B281 /* Foundation.framework in Frameworks */,
-				CD7ADE4D174315F400B5B281 /* CoreGraphics.framework in Frameworks */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		CD7ADE61174315F400B5B281 /* Frameworks */ = {
-			isa = PBXFrameworksBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				CD7ADE67174315F400B5B281 /* SenTestingKit.framework in Frameworks */,
-				CD7ADE68174315F400B5B281 /* UIKit.framework in Frameworks */,
-				CD7ADE69174315F400B5B281 /* Foundation.framework in Frameworks */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-/* End PBXFrameworksBuildPhase section */
-
-/* Begin PBXGroup section */
-		CD7ADE3C174315F400B5B281 = {
-			isa = PBXGroup;
-			children = (
-				CD7ADE4E174315F400B5B281 /* MovieLibrary */,
-				CD7ADE6C174315F400B5B281 /* MovieLibraryTests */,
-				CD7ADE47174315F400B5B281 /* Frameworks */,
-				CD7ADE46174315F400B5B281 /* Products */,
-			);
-			sourceTree = "<group>";
-		};
-		CD7ADE46174315F400B5B281 /* Products */ = {
-			isa = PBXGroup;
-			children = (
-				CD7ADE45174315F400B5B281 /* MovieLibrary.app */,
-				CD7ADE65174315F400B5B281 /* MovieLibraryTests.octest */,
-			);
-			name = Products;
-			sourceTree = "<group>";
-		};
-		CD7ADE47174315F400B5B281 /* Frameworks */ = {
-			isa = PBXGroup;
-			children = (
-				CD7ADE48174315F400B5B281 /* UIKit.framework */,
-				CD7ADE4A174315F400B5B281 /* Foundation.framework */,
-				CD7ADE4C174315F400B5B281 /* CoreGraphics.framework */,
-				CD7ADE66174315F400B5B281 /* SenTestingKit.framework */,
-			);
-			name = Frameworks;
-			sourceTree = "<group>";
-		};
-		CD7ADE4E174315F400B5B281 /* MovieLibrary */ = {
-			isa = PBXGroup;
-			children = (
-				CD7ADE57174315F400B5B281 /* AppDelegate.h */,
-				CD7ADE58174315F400B5B281 /* AppDelegate.m */,
-				CD7ADE4F174315F400B5B281 /* Supporting Files */,
-			);
-			path = MovieLibrary;
-			sourceTree = "<group>";
-		};
-		CD7ADE4F174315F400B5B281 /* Supporting Files */ = {
-			isa = PBXGroup;
-			children = (
-				CD7ADE50174315F400B5B281 /* MovieLibrary-Info.plist */,
-				CD7ADE51174315F400B5B281 /* InfoPlist.strings */,
-				CD7ADE54174315F400B5B281 /* main.m */,
-				CD7ADE56174315F400B5B281 /* MovieLibrary-Prefix.pch */,
-				CD7ADE5A174315F400B5B281 /* Default.png */,
-				CD7ADE5C174315F400B5B281 /* Default@2x.png */,
-				CD7ADE5E174315F400B5B281 /* Default-568h@2x.png */,
-			);
-			name = "Supporting Files";
-			sourceTree = "<group>";
-		};
-		CD7ADE6C174315F400B5B281 /* MovieLibraryTests */ = {
-			isa = PBXGroup;
-			children = (
-				CD7ADE72174315F400B5B281 /* MovieLibraryTests.h */,
-				CD7ADE73174315F400B5B281 /* MovieLibraryTests.m */,
-				CD7ADE6D174315F400B5B281 /* Supporting Files */,
-			);
-			path = MovieLibraryTests;
-			sourceTree = "<group>";
-		};
-		CD7ADE6D174315F400B5B281 /* Supporting Files */ = {
-			isa = PBXGroup;
-			children = (
-				CD7ADE6E174315F400B5B281 /* MovieLibraryTests-Info.plist */,
-				CD7ADE6F174315F400B5B281 /* InfoPlist.strings */,
-			);
-			name = "Supporting Files";
-			sourceTree = "<group>";
-		};
-/* End PBXGroup section */
-
-/* Begin PBXNativeTarget section */
-		CD7ADE44174315F400B5B281 /* MovieLibrary */ = {
-			isa = PBXNativeTarget;
-			buildConfigurationList = CD7ADE77174315F400B5B281 /* Build configuration list for PBXNativeTarget "MovieLibrary" */;
-			buildPhases = (
-				CD7ADE41174315F400B5B281 /* Sources */,
-				CD7ADE42174315F400B5B281 /* Frameworks */,
-				CD7ADE43174315F400B5B281 /* Resources */,
-			);
-			buildRules = (
-			);
-			dependencies = (
-			);
-			name = MovieLibrary;
-			productName = MovieLibrary;
-			productReference = CD7ADE45174315F400B5B281 /* MovieLibrary.app */;
-			productType = "com.apple.product-type.application";
-		};
-		CD7ADE64174315F400B5B281 /* MovieLibraryTests */ = {
-			isa = PBXNativeTarget;
-			buildConfigurationList = CD7ADE7A174315F400B5B281 /* Build configuration list for PBXNativeTarget "MovieLibraryTests" */;
-			buildPhases = (
-				CD7ADE60174315F400B5B281 /* Sources */,
-				CD7ADE61174315F400B5B281 /* Frameworks */,
-				CD7ADE62174315F400B5B281 /* Resources */,
-				CD7ADE63174315F400B5B281 /* ShellScript */,
-			);
-			buildRules = (
-			);
-			dependencies = (
-				CD7ADE6B174315F400B5B281 /* PBXTargetDependency */,
-			);
-			name = MovieLibraryTests;
-			productName = MovieLibraryTests;
-			productReference = CD7ADE65174315F400B5B281 /* MovieLibraryTests.octest */;
-			productType = "com.apple.product-type.bundle";
-		};
-/* End PBXNativeTarget section */
-
-/* Begin PBXProject section */
-		CD7ADE3D174315F400B5B281 /* Project object */ = {
-			isa = PBXProject;
-			attributes = {
-				LastUpgradeCheck = 0460;
-				ORGANIZATIONNAME = "mo khan";
-			};
-			buildConfigurationList = CD7ADE40174315F400B5B281 /* Build configuration list for PBXProject "MovieLibrary" */;
-			compatibilityVersion = "Xcode 3.2";
-			developmentRegion = English;
-			hasScannedForEncodings = 0;
-			knownRegions = (
-				en,
-			);
-			mainGroup = CD7ADE3C174315F400B5B281;
-			productRefGroup = CD7ADE46174315F400B5B281 /* Products */;
-			projectDirPath = "";
-			projectRoot = "";
-			targets = (
-				CD7ADE44174315F400B5B281 /* MovieLibrary */,
-				CD7ADE64174315F400B5B281 /* MovieLibraryTests */,
-			);
-		};
-/* End PBXProject section */
-
-/* Begin PBXResourcesBuildPhase section */
-		CD7ADE43174315F400B5B281 /* Resources */ = {
-			isa = PBXResourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				CD7ADE53174315F400B5B281 /* InfoPlist.strings in Resources */,
-				CD7ADE5B174315F400B5B281 /* Default.png in Resources */,
-				CD7ADE5D174315F400B5B281 /* Default@2x.png in Resources */,
-				CD7ADE5F174315F400B5B281 /* Default-568h@2x.png in Resources */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		CD7ADE62174315F400B5B281 /* Resources */ = {
-			isa = PBXResourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				CD7ADE71174315F400B5B281 /* InfoPlist.strings in Resources */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-/* End PBXResourcesBuildPhase section */
-
-/* Begin PBXShellScriptBuildPhase section */
-		CD7ADE63174315F400B5B281 /* ShellScript */ = {
-			isa = PBXShellScriptBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-			);
-			inputPaths = (
-			);
-			outputPaths = (
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-			shellPath = /bin/sh;
-			shellScript = "# Run the unit tests in this test bundle.\n\"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests\"\n";
-		};
-/* End PBXShellScriptBuildPhase section */
-
-/* Begin PBXSourcesBuildPhase section */
-		CD7ADE41174315F400B5B281 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				CD7ADE55174315F400B5B281 /* main.m in Sources */,
-				CD7ADE59174315F400B5B281 /* AppDelegate.m in Sources */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		CD7ADE60174315F400B5B281 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				CD7ADE74174315F400B5B281 /* MovieLibraryTests.m in Sources */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-/* End PBXSourcesBuildPhase section */
-
-/* Begin PBXTargetDependency section */
-		CD7ADE6B174315F400B5B281 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = CD7ADE44174315F400B5B281 /* MovieLibrary */;
-			targetProxy = CD7ADE6A174315F400B5B281 /* PBXContainerItemProxy */;
-		};
-/* End PBXTargetDependency section */
-
-/* Begin PBXVariantGroup section */
-		CD7ADE51174315F400B5B281 /* InfoPlist.strings */ = {
-			isa = PBXVariantGroup;
-			children = (
-				CD7ADE52174315F400B5B281 /* en */,
-			);
-			name = InfoPlist.strings;
-			sourceTree = "<group>";
-		};
-		CD7ADE6F174315F400B5B281 /* InfoPlist.strings */ = {
-			isa = PBXVariantGroup;
-			children = (
-				CD7ADE70174315F400B5B281 /* en */,
-			);
-			name = InfoPlist.strings;
-			sourceTree = "<group>";
-		};
-/* End PBXVariantGroup section */
-
-/* Begin XCBuildConfiguration section */
-		CD7ADE75174315F400B5B281 /* Debug */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
-				CLANG_CXX_LIBRARY = "libc++";
-				CLANG_ENABLE_OBJC_ARC = YES;
-				CLANG_WARN_CONSTANT_CONVERSION = YES;
-				CLANG_WARN_EMPTY_BODY = YES;
-				CLANG_WARN_ENUM_CONVERSION = YES;
-				CLANG_WARN_INT_CONVERSION = YES;
-				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
-				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
-				COPY_PHASE_STRIP = NO;
-				GCC_C_LANGUAGE_STANDARD = gnu99;
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_PREPROCESSOR_DEFINITIONS = (
-					"DEBUG=1",
-					"$(inherited)",
-				);
-				GCC_SYMBOLS_PRIVATE_EXTERN = NO;
-				GCC_WARN_ABOUT_RETURN_TYPE = YES;
-				GCC_WARN_UNINITIALIZED_AUTOS = YES;
-				GCC_WARN_UNUSED_VARIABLE = YES;
-				IPHONEOS_DEPLOYMENT_TARGET = 6.1;
-				ONLY_ACTIVE_ARCH = YES;
-				SDKROOT = iphoneos;
-			};
-			name = Debug;
-		};
-		CD7ADE76174315F400B5B281 /* Release */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
-				CLANG_CXX_LIBRARY = "libc++";
-				CLANG_ENABLE_OBJC_ARC = YES;
-				CLANG_WARN_CONSTANT_CONVERSION = YES;
-				CLANG_WARN_EMPTY_BODY = YES;
-				CLANG_WARN_ENUM_CONVERSION = YES;
-				CLANG_WARN_INT_CONVERSION = YES;
-				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
-				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
-				COPY_PHASE_STRIP = YES;
-				GCC_C_LANGUAGE_STANDARD = gnu99;
-				GCC_WARN_ABOUT_RETURN_TYPE = YES;
-				GCC_WARN_UNINITIALIZED_AUTOS = YES;
-				GCC_WARN_UNUSED_VARIABLE = YES;
-				IPHONEOS_DEPLOYMENT_TARGET = 6.1;
-				OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1";
-				SDKROOT = iphoneos;
-				VALIDATE_PRODUCT = YES;
-			};
-			name = Release;
-		};
-		CD7ADE78174315F400B5B281 /* Debug */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				GCC_PRECOMPILE_PREFIX_HEADER = YES;
-				GCC_PREFIX_HEADER = "MovieLibrary/MovieLibrary-Prefix.pch";
-				INFOPLIST_FILE = "MovieLibrary/MovieLibrary-Info.plist";
-				PRODUCT_NAME = "$(TARGET_NAME)";
-				WRAPPER_EXTENSION = app;
-			};
-			name = Debug;
-		};
-		CD7ADE79174315F400B5B281 /* Release */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				GCC_PRECOMPILE_PREFIX_HEADER = YES;
-				GCC_PREFIX_HEADER = "MovieLibrary/MovieLibrary-Prefix.pch";
-				INFOPLIST_FILE = "MovieLibrary/MovieLibrary-Info.plist";
-				PRODUCT_NAME = "$(TARGET_NAME)";
-				WRAPPER_EXTENSION = app;
-			};
-			name = Release;
-		};
-		CD7ADE7B174315F400B5B281 /* Debug */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/MovieLibrary.app/MovieLibrary";
-				FRAMEWORK_SEARCH_PATHS = (
-					"\"$(SDKROOT)/Developer/Library/Frameworks\"",
-					"\"$(DEVELOPER_LIBRARY_DIR)/Frameworks\"",
-				);
-				GCC_PRECOMPILE_PREFIX_HEADER = YES;
-				GCC_PREFIX_HEADER = "MovieLibrary/MovieLibrary-Prefix.pch";
-				INFOPLIST_FILE = "MovieLibraryTests/MovieLibraryTests-Info.plist";
-				PRODUCT_NAME = "$(TARGET_NAME)";
-				TEST_HOST = "$(BUNDLE_LOADER)";
-				WRAPPER_EXTENSION = octest;
-			};
-			name = Debug;
-		};
-		CD7ADE7C174315F400B5B281 /* Release */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/MovieLibrary.app/MovieLibrary";
-				FRAMEWORK_SEARCH_PATHS = (
-					"\"$(SDKROOT)/Developer/Library/Frameworks\"",
-					"\"$(DEVELOPER_LIBRARY_DIR)/Frameworks\"",
-				);
-				GCC_PRECOMPILE_PREFIX_HEADER = YES;
-				GCC_PREFIX_HEADER = "MovieLibrary/MovieLibrary-Prefix.pch";
-				INFOPLIST_FILE = "MovieLibraryTests/MovieLibraryTests-Info.plist";
-				PRODUCT_NAME = "$(TARGET_NAME)";
-				TEST_HOST = "$(BUNDLE_LOADER)";
-				WRAPPER_EXTENSION = octest;
-			};
-			name = Release;
-		};
-/* End XCBuildConfiguration section */
-
-/* Begin XCConfigurationList section */
-		CD7ADE40174315F400B5B281 /* Build configuration list for PBXProject "MovieLibrary" */ = {
-			isa = XCConfigurationList;
-			buildConfigurations = (
-				CD7ADE75174315F400B5B281 /* Debug */,
-				CD7ADE76174315F400B5B281 /* Release */,
-			);
-			defaultConfigurationIsVisible = 0;
-			defaultConfigurationName = Release;
-		};
-		CD7ADE77174315F400B5B281 /* Build configuration list for PBXNativeTarget "MovieLibrary" */ = {
-			isa = XCConfigurationList;
-			buildConfigurations = (
-				CD7ADE78174315F400B5B281 /* Debug */,
-				CD7ADE79174315F400B5B281 /* Release */,
-			);
-			defaultConfigurationIsVisible = 0;
-		};
-		CD7ADE7A174315F400B5B281 /* Build configuration list for PBXNativeTarget "MovieLibraryTests" */ = {
-			isa = XCConfigurationList;
-			buildConfigurations = (
-				CD7ADE7B174315F400B5B281 /* Debug */,
-				CD7ADE7C174315F400B5B281 /* Release */,
-			);
-			defaultConfigurationIsVisible = 0;
-		};
-/* End XCConfigurationList section */
-	};
-	rootObject = CD7ADE3D174315F400B5B281 /* Project object */;
-}
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>archiveVersion</key>
+	<string>1</string>
+	<key>classes</key>
+	<dict/>
+	<key>objectVersion</key>
+	<string>46</string>
+	<key>objects</key>
+	<dict>
+		<key>89060F98329F48E6ADCAAFE6</key>
+		<dict>
+			<key>explicitFileType</key>
+			<string>archive.ar</string>
+			<key>includeInIndex</key>
+			<string>0</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>name</key>
+			<string>libPods-MovieLibraryTests.a</string>
+			<key>path</key>
+			<string>libPods-MovieLibraryTests.a</string>
+			<key>sourceTree</key>
+			<string>BUILT_PRODUCTS_DIR</string>
+		</dict>
+		<key>8E61FD95BC314123A6B84138</key>
+		<dict>
+			<key>fileRef</key>
+			<string>89060F98329F48E6ADCAAFE6</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>A9876C9405FE4D18AFE6AE87</key>
+		<dict>
+			<key>buildActionMask</key>
+			<string>2147483647</string>
+			<key>files</key>
+			<array/>
+			<key>inputPaths</key>
+			<array/>
+			<key>isa</key>
+			<string>PBXShellScriptBuildPhase</string>
+			<key>name</key>
+			<string>Check Pods Manifest.lock</string>
+			<key>outputPaths</key>
+			<array/>
+			<key>runOnlyForDeploymentPostprocessing</key>
+			<string>0</string>
+			<key>shellPath</key>
+			<string>/bin/sh</string>
+			<key>shellScript</key>
+			<string>diff "${PODS_ROOT}/../Podfile.lock" "${PODS_ROOT}/Manifest.lock" &gt; /dev/null
+if [[ $? != 0 ]] ; then
+    cat &lt;&lt; EOM
+error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.
+EOM
+    exit 1
+fi
+</string>
+			<key>showEnvVarsInLog</key>
+			<string>1</string>
+		</dict>
+		<key>B61B6AE7BC95430791770657</key>
+		<dict>
+			<key>buildActionMask</key>
+			<string>2147483647</string>
+			<key>files</key>
+			<array/>
+			<key>inputPaths</key>
+			<array/>
+			<key>isa</key>
+			<string>PBXShellScriptBuildPhase</string>
+			<key>name</key>
+			<string>Copy Pods Resources</string>
+			<key>outputPaths</key>
+			<array/>
+			<key>runOnlyForDeploymentPostprocessing</key>
+			<string>0</string>
+			<key>shellPath</key>
+			<string>/bin/sh</string>
+			<key>shellScript</key>
+			<string>"${SRCROOT}/Pods/Pods-MovieLibraryTests-resources.sh"
+</string>
+			<key>showEnvVarsInLog</key>
+			<string>1</string>
+		</dict>
+		<key>CD7ADE3C174315F400B5B281</key>
+		<dict>
+			<key>children</key>
+			<array>
+				<string>CD7ADE4E174315F400B5B281</string>
+				<string>CD7ADE6C174315F400B5B281</string>
+				<string>CD7ADE47174315F400B5B281</string>
+				<string>CD7ADE46174315F400B5B281</string>
+				<string>D91DCCBA6E0B41B789B58675</string>
+			</array>
+			<key>isa</key>
+			<string>PBXGroup</string>
+			<key>sourceTree</key>
+			<string>&lt;group&gt;</string>
+		</dict>
+		<key>CD7ADE3D174315F400B5B281</key>
+		<dict>
+			<key>attributes</key>
+			<dict>
+				<key>LastUpgradeCheck</key>
+				<string>0460</string>
+				<key>ORGANIZATIONNAME</key>
+				<string>mo khan</string>
+			</dict>
+			<key>buildConfigurationList</key>
+			<string>CD7ADE40174315F400B5B281</string>
+			<key>compatibilityVersion</key>
+			<string>Xcode 3.2</string>
+			<key>developmentRegion</key>
+			<string>English</string>
+			<key>hasScannedForEncodings</key>
+			<string>0</string>
+			<key>isa</key>
+			<string>PBXProject</string>
+			<key>knownRegions</key>
+			<array>
+				<string>en</string>
+			</array>
+			<key>mainGroup</key>
+			<string>CD7ADE3C174315F400B5B281</string>
+			<key>productRefGroup</key>
+			<string>CD7ADE46174315F400B5B281</string>
+			<key>projectDirPath</key>
+			<string></string>
+			<key>projectReferences</key>
+			<array/>
+			<key>projectRoot</key>
+			<string></string>
+			<key>targets</key>
+			<array>
+				<string>CD7ADE44174315F400B5B281</string>
+				<string>CD7ADE64174315F400B5B281</string>
+			</array>
+		</dict>
+		<key>CD7ADE40174315F400B5B281</key>
+		<dict>
+			<key>buildConfigurations</key>
+			<array>
+				<string>CD7ADE75174315F400B5B281</string>
+				<string>CD7ADE76174315F400B5B281</string>
+			</array>
+			<key>defaultConfigurationIsVisible</key>
+			<string>0</string>
+			<key>defaultConfigurationName</key>
+			<string>Release</string>
+			<key>isa</key>
+			<string>XCConfigurationList</string>
+		</dict>
+		<key>CD7ADE41174315F400B5B281</key>
+		<dict>
+			<key>buildActionMask</key>
+			<string>2147483647</string>
+			<key>files</key>
+			<array>
+				<string>CD7ADE55174315F400B5B281</string>
+				<string>CD7ADE59174315F400B5B281</string>
+			</array>
+			<key>isa</key>
+			<string>PBXSourcesBuildPhase</string>
+			<key>runOnlyForDeploymentPostprocessing</key>
+			<string>0</string>
+		</dict>
+		<key>CD7ADE42174315F400B5B281</key>
+		<dict>
+			<key>buildActionMask</key>
+			<string>2147483647</string>
+			<key>files</key>
+			<array>
+				<string>CD7ADE49174315F400B5B281</string>
+				<string>CD7ADE4B174315F400B5B281</string>
+				<string>CD7ADE4D174315F400B5B281</string>
+			</array>
+			<key>isa</key>
+			<string>PBXFrameworksBuildPhase</string>
+			<key>runOnlyForDeploymentPostprocessing</key>
+			<string>0</string>
+		</dict>
+		<key>CD7ADE43174315F400B5B281</key>
+		<dict>
+			<key>buildActionMask</key>
+			<string>2147483647</string>
+			<key>files</key>
+			<array>
+				<string>CD7ADE53174315F400B5B281</string>
+				<string>CD7ADE5B174315F400B5B281</string>
+				<string>CD7ADE5D174315F400B5B281</string>
+				<string>CD7ADE5F174315F400B5B281</string>
+			</array>
+			<key>isa</key>
+			<string>PBXResourcesBuildPhase</string>
+			<key>runOnlyForDeploymentPostprocessing</key>
+			<string>0</string>
+		</dict>
+		<key>CD7ADE44174315F400B5B281</key>
+		<dict>
+			<key>buildConfigurationList</key>
+			<string>CD7ADE77174315F400B5B281</string>
+			<key>buildPhases</key>
+			<array>
+				<string>CD7ADE41174315F400B5B281</string>
+				<string>CD7ADE42174315F400B5B281</string>
+				<string>CD7ADE43174315F400B5B281</string>
+			</array>
+			<key>buildRules</key>
+			<array/>
+			<key>dependencies</key>
+			<array/>
+			<key>isa</key>
+			<string>PBXNativeTarget</string>
+			<key>name</key>
+			<string>MovieLibrary</string>
+			<key>productName</key>
+			<string>MovieLibrary</string>
+			<key>productReference</key>
+			<string>CD7ADE45174315F400B5B281</string>
+			<key>productType</key>
+			<string>com.apple.product-type.application</string>
+		</dict>
+		<key>CD7ADE45174315F400B5B281</key>
+		<dict>
+			<key>explicitFileType</key>
+			<string>wrapper.application</string>
+			<key>includeInIndex</key>
+			<string>0</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>path</key>
+			<string>MovieLibrary.app</string>
+			<key>sourceTree</key>
+			<string>BUILT_PRODUCTS_DIR</string>
+		</dict>
+		<key>CD7ADE46174315F400B5B281</key>
+		<dict>
+			<key>children</key>
+			<array>
+				<string>CD7ADE45174315F400B5B281</string>
+				<string>CD7ADE65174315F400B5B281</string>
+			</array>
+			<key>isa</key>
+			<string>PBXGroup</string>
+			<key>name</key>
+			<string>Products</string>
+			<key>sourceTree</key>
+			<string>&lt;group&gt;</string>
+		</dict>
+		<key>CD7ADE47174315F400B5B281</key>
+		<dict>
+			<key>children</key>
+			<array>
+				<string>CD7ADE48174315F400B5B281</string>
+				<string>CD7ADE4A174315F400B5B281</string>
+				<string>CD7ADE4C174315F400B5B281</string>
+				<string>CD7ADE66174315F400B5B281</string>
+				<string>89060F98329F48E6ADCAAFE6</string>
+			</array>
+			<key>isa</key>
+			<string>PBXGroup</string>
+			<key>name</key>
+			<string>Frameworks</string>
+			<key>sourceTree</key>
+			<string>&lt;group&gt;</string>
+		</dict>
+		<key>CD7ADE48174315F400B5B281</key>
+		<dict>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>wrapper.framework</string>
+			<key>name</key>
+			<string>UIKit.framework</string>
+			<key>path</key>
+			<string>System/Library/Frameworks/UIKit.framework</string>
+			<key>sourceTree</key>
+			<string>SDKROOT</string>
+		</dict>
+		<key>CD7ADE49174315F400B5B281</key>
+		<dict>
+			<key>fileRef</key>
+			<string>CD7ADE48174315F400B5B281</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+		</dict>
+		<key>CD7ADE4A174315F400B5B281</key>
+		<dict>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>wrapper.framework</string>
+			<key>name</key>
+			<string>Foundation.framework</string>
+			<key>path</key>
+			<string>System/Library/Frameworks/Foundation.framework</string>
+			<key>sourceTree</key>
+			<string>SDKROOT</string>
+		</dict>
+		<key>CD7ADE4B174315F400B5B281</key>
+		<dict>
+			<key>fileRef</key>
+			<string>CD7ADE4A174315F400B5B281</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+		</dict>
+		<key>CD7ADE4C174315F400B5B281</key>
+		<dict>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>wrapper.framework</string>
+			<key>name</key>
+			<string>CoreGraphics.framework</string>
+			<key>path</key>
+			<string>System/Library/Frameworks/CoreGraphics.framework</string>
+			<key>sourceTree</key>
+			<string>SDKROOT</string>
+		</dict>
+		<key>CD7ADE4D174315F400B5B281</key>
+		<dict>
+			<key>fileRef</key>
+			<string>CD7ADE4C174315F400B5B281</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+		</dict>
+		<key>CD7ADE4E174315F400B5B281</key>
+		<dict>
+			<key>children</key>
+			<array>
+				<string>CD7ADE57174315F400B5B281</string>
+				<string>CD7ADE58174315F400B5B281</string>
+				<string>CD7ADE4F174315F400B5B281</string>
+			</array>
+			<key>isa</key>
+			<string>PBXGroup</string>
+			<key>path</key>
+			<string>MovieLibrary</string>
+			<key>sourceTree</key>
+			<string>&lt;group&gt;</string>
+		</dict>
+		<key>CD7ADE4F174315F400B5B281</key>
+		<dict>
+			<key>children</key>
+			<array>
+				<string>CD7ADE50174315F400B5B281</string>
+				<string>CD7ADE51174315F400B5B281</string>
+				<string>CD7ADE54174315F400B5B281</string>
+				<string>CD7ADE56174315F400B5B281</string>
+				<string>CD7ADE5A174315F400B5B281</string>
+				<string>CD7ADE5C174315F400B5B281</string>
+				<string>CD7ADE5E174315F400B5B281</string>
+			</array>
+			<key>isa</key>
+			<string>PBXGroup</string>
+			<key>name</key>
+			<string>Supporting Files</string>
+			<key>sourceTree</key>
+			<string>&lt;group&gt;</string>
+		</dict>
+		<key>CD7ADE50174315F400B5B281</key>
+		<dict>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>text.plist.xml</string>
+			<key>path</key>
+			<string>MovieLibrary-Info.plist</string>
+			<key>sourceTree</key>
+			<string>&lt;group&gt;</string>
+		</dict>
+		<key>CD7ADE51174315F400B5B281</key>
+		<dict>
+			<key>children</key>
+			<array>
+				<string>CD7ADE52174315F400B5B281</string>
+			</array>
+			<key>isa</key>
+			<string>PBXVariantGroup</string>
+			<key>name</key>
+			<string>InfoPlist.strings</string>
+			<key>sourceTree</key>
+			<string>&lt;group&gt;</string>
+		</dict>
+		<key>CD7ADE52174315F400B5B281</key>
+		<dict>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>text.plist.strings</string>
+			<key>name</key>
+			<string>en</string>
+			<key>path</key>
+			<string>en.lproj/InfoPlist.strings</string>
+			<key>sourceTree</key>
+			<string>&lt;group&gt;</string>
+		</dict>
+		<key>CD7ADE53174315F400B5B281</key>
+		<dict>
+			<key>fileRef</key>
+			<string>CD7ADE51174315F400B5B281</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+		</dict>
+		<key>CD7ADE54174315F400B5B281</key>
+		<dict>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>path</key>
+			<string>main.m</string>
+			<key>sourceTree</key>
+			<string>&lt;group&gt;</string>
+		</dict>
+		<key>CD7ADE55174315F400B5B281</key>
+		<dict>
+			<key>fileRef</key>
+			<string>CD7ADE54174315F400B5B281</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+		</dict>
+		<key>CD7ADE56174315F400B5B281</key>
+		<dict>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>path</key>
+			<string>MovieLibrary-Prefix.pch</string>
+			<key>sourceTree</key>
+			<string>&lt;group&gt;</string>
+		</dict>
+		<key>CD7ADE57174315F400B5B281</key>
+		<dict>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>path</key>
+			<string>AppDelegate.h</string>
+			<key>sourceTree</key>
+			<string>&lt;group&gt;</string>
+		</dict>
+		<key>CD7ADE58174315F400B5B281</key>
+		<dict>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>path</key>
+			<string>AppDelegate.m</string>
+			<key>sourceTree</key>
+			<string>&lt;group&gt;</string>
+		</dict>
+		<key>CD7ADE59174315F400B5B281</key>
+		<dict>
+			<key>fileRef</key>
+			<string>CD7ADE58174315F400B5B281</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+		</dict>
+		<key>CD7ADE5A174315F400B5B281</key>
+		<dict>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>image.png</string>
+			<key>path</key>
+			<string>Default.png</string>
+			<key>sourceTree</key>
+			<string>&lt;group&gt;</string>
+		</dict>
+		<key>CD7ADE5B174315F400B5B281</key>
+		<dict>
+			<key>fileRef</key>
+			<string>CD7ADE5A174315F400B5B281</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+		</dict>
+		<key>CD7ADE5C174315F400B5B281</key>
+		<dict>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>image.png</string>
+			<key>path</key>
+			<string>Default@2x.png</string>
+			<key>sourceTree</key>
+			<string>&lt;group&gt;</string>
+		</dict>
+		<key>CD7ADE5D174315F400B5B281</key>
+		<dict>
+			<key>fileRef</key>
+			<string>CD7ADE5C174315F400B5B281</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+		</dict>
+		<key>CD7ADE5E174315F400B5B281</key>
+		<dict>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>image.png</string>
+			<key>path</key>
+			<string>Default-568h@2x.png</string>
+			<key>sourceTree</key>
+			<string>&lt;group&gt;</string>
+		</dict>
+		<key>CD7ADE5F174315F400B5B281</key>
+		<dict>
+			<key>fileRef</key>
+			<string>CD7ADE5E174315F400B5B281</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+		</dict>
+		<key>CD7ADE60174315F400B5B281</key>
+		<dict>
+			<key>buildActionMask</key>
+			<string>2147483647</string>
+			<key>files</key>
+			<array>
+				<string>CD7ADE74174315F400B5B281</string>
+			</array>
+			<key>isa</key>
+			<string>PBXSourcesBuildPhase</string>
+			<key>runOnlyForDeploymentPostprocessing</key>
+			<string>0</string>
+		</dict>
+		<key>CD7ADE61174315F400B5B281</key>
+		<dict>
+			<key>buildActionMask</key>
+			<string>2147483647</string>
+			<key>files</key>
+			<array>
+				<string>CD7ADE67174315F400B5B281</string>
+				<string>CD7ADE68174315F400B5B281</string>
+				<string>CD7ADE69174315F400B5B281</string>
+				<string>8E61FD95BC314123A6B84138</string>
+			</array>
+			<key>isa</key>
+			<string>PBXFrameworksBuildPhase</string>
+			<key>runOnlyForDeploymentPostprocessing</key>
+			<string>0</string>
+		</dict>
+		<key>CD7ADE62174315F400B5B281</key>
+		<dict>
+			<key>buildActionMask</key>
+			<string>2147483647</string>
+			<key>files</key>
+			<array>
+				<string>CD7ADE71174315F400B5B281</string>
+			</array>
+			<key>isa</key>
+			<string>PBXResourcesBuildPhase</string>
+			<key>runOnlyForDeploymentPostprocessing</key>
+			<string>0</string>
+		</dict>
+		<key>CD7ADE63174315F400B5B281</key>
+		<dict>
+			<key>buildActionMask</key>
+			<string>2147483647</string>
+			<key>files</key>
+			<array/>
+			<key>inputPaths</key>
+			<array/>
+			<key>isa</key>
+			<string>PBXShellScriptBuildPhase</string>
+			<key>outputPaths</key>
+			<array/>
+			<key>runOnlyForDeploymentPostprocessing</key>
+			<string>0</string>
+			<key>shellPath</key>
+			<string>/bin/sh</string>
+			<key>shellScript</key>
+			<string># Run the unit tests in this test bundle.
+"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests"
+</string>
+		</dict>
+		<key>CD7ADE64174315F400B5B281</key>
+		<dict>
+			<key>buildConfigurationList</key>
+			<string>CD7ADE7A174315F400B5B281</string>
+			<key>buildPhases</key>
+			<array>
+				<string>A9876C9405FE4D18AFE6AE87</string>
+				<string>CD7ADE60174315F400B5B281</string>
+				<string>CD7ADE61174315F400B5B281</string>
+				<string>CD7ADE62174315F400B5B281</string>
+				<string>CD7ADE63174315F400B5B281</string>
+				<string>B61B6AE7BC95430791770657</string>
+			</array>
+			<key>buildRules</key>
+			<array/>
+			<key>dependencies</key>
+			<array>
+				<string>CD7ADE6B174315F400B5B281</string>
+			</array>
+			<key>isa</key>
+			<string>PBXNativeTarget</string>
+			<key>name</key>
+			<string>MovieLibraryTests</string>
+			<key>productName</key>
+			<string>MovieLibraryTests</string>
+			<key>productReference</key>
+			<string>CD7ADE65174315F400B5B281</string>
+			<key>productType</key>
+			<string>com.apple.product-type.bundle</string>
+		</dict>
+		<key>CD7ADE65174315F400B5B281</key>
+		<dict>
+			<key>explicitFileType</key>
+			<string>wrapper.cfbundle</string>
+			<key>includeInIndex</key>
+			<string>0</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>path</key>
+			<string>MovieLibraryTests.octest</string>
+			<key>sourceTree</key>
+			<string>BUILT_PRODUCTS_DIR</string>
+		</dict>
+		<key>CD7ADE66174315F400B5B281</key>
+		<dict>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>wrapper.framework</string>
+			<key>name</key>
+			<string>SenTestingKit.framework</string>
+			<key>path</key>
+			<string>Library/Frameworks/SenTestingKit.framework</string>
+			<key>sourceTree</key>
+			<string>DEVELOPER_DIR</string>
+		</dict>
+		<key>CD7ADE67174315F400B5B281</key>
+		<dict>
+			<key>fileRef</key>
+			<string>CD7ADE66174315F400B5B281</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+		</dict>
+		<key>CD7ADE68174315F400B5B281</key>
+		<dict>
+			<key>fileRef</key>
+			<string>CD7ADE48174315F400B5B281</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+		</dict>
+		<key>CD7ADE69174315F400B5B281</key>
+		<dict>
+			<key>fileRef</key>
+			<string>CD7ADE4A174315F400B5B281</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+		</dict>
+		<key>CD7ADE6A174315F400B5B281</key>
+		<dict>
+			<key>containerPortal</key>
+			<string>CD7ADE3D174315F400B5B281</string>
+			<key>isa</key>
+			<string>PBXContainerItemProxy</string>
+			<key>proxyType</key>
+			<string>1</string>
+			<key>remoteGlobalIDString</key>
+			<string>CD7ADE44174315F400B5B281</string>
+			<key>remoteInfo</key>
+			<string>MovieLibrary</string>
+		</dict>
+		<key>CD7ADE6B174315F400B5B281</key>
+		<dict>
+			<key>isa</key>
+			<string>PBXTargetDependency</string>
+			<key>target</key>
+			<string>CD7ADE44174315F400B5B281</string>
+			<key>targetProxy</key>
+			<string>CD7ADE6A174315F400B5B281</string>
+		</dict>
+		<key>CD7ADE6C174315F400B5B281</key>
+		<dict>
+			<key>children</key>
+			<array>
+				<string>CD7ADE72174315F400B5B281</string>
+				<string>CD7ADE73174315F400B5B281</string>
+				<string>CD7ADE6D174315F400B5B281</string>
+			</array>
+			<key>isa</key>
+			<string>PBXGroup</string>
+			<key>path</key>
+			<string>MovieLibraryTests</string>
+			<key>sourceTree</key>
+			<string>&lt;group&gt;</string>
+		</dict>
+		<key>CD7ADE6D174315F400B5B281</key>
+		<dict>
+			<key>children</key>
+			<array>
+				<string>CD7ADE6E174315F400B5B281</string>
+				<string>CD7ADE6F174315F400B5B281</string>
+			</array>
+			<key>isa</key>
+			<string>PBXGroup</string>
+			<key>name</key>
+			<string>Supporting Files</string>
+			<key>sourceTree</key>
+			<string>&lt;group&gt;</string>
+		</dict>
+		<key>CD7ADE6E174315F400B5B281</key>
+		<dict>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>text.plist.xml</string>
+			<key>path</key>
+			<string>MovieLibraryTests-Info.plist</string>
+			<key>sourceTree</key>
+			<string>&lt;group&gt;</string>
+		</dict>
+		<key>CD7ADE6F174315F400B5B281</key>
+		<dict>
+			<key>children</key>
+			<array>
+				<string>CD7ADE70174315F400B5B281</string>
+			</array>
+			<key>isa</key>
+			<string>PBXVariantGroup</string>
+			<key>name</key>
+			<string>InfoPlist.strings</string>
+			<key>sourceTree</key>
+			<string>&lt;group&gt;</string>
+		</dict>
+		<key>CD7ADE70174315F400B5B281</key>
+		<dict>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>text.plist.strings</string>
+			<key>name</key>
+			<string>en</string>
+			<key>path</key>
+			<string>en.lproj/InfoPlist.strings</string>
+			<key>sourceTree</key>
+			<string>&lt;group&gt;</string>
+		</dict>
+		<key>CD7ADE71174315F400B5B281</key>
+		<dict>
+			<key>fileRef</key>
+			<string>CD7ADE6F174315F400B5B281</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+		</dict>
+		<key>CD7ADE72174315F400B5B281</key>
+		<dict>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>path</key>
+			<string>MovieLibraryTests.h</string>
+			<key>sourceTree</key>
+			<string>&lt;group&gt;</string>
+		</dict>
+		<key>CD7ADE73174315F400B5B281</key>
+		<dict>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>path</key>
+			<string>MovieLibraryTests.m</string>
+			<key>sourceTree</key>
+			<string>&lt;group&gt;</string>
+		</dict>
+		<key>CD7ADE74174315F400B5B281</key>
+		<dict>
+			<key>fileRef</key>
+			<string>CD7ADE73174315F400B5B281</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+		</dict>
+		<key>CD7ADE75174315F400B5B281</key>
+		<dict>
+			<key>buildSettings</key>
+			<dict>
+				<key>ALWAYS_SEARCH_USER_PATHS</key>
+				<string>NO</string>
+				<key>CLANG_CXX_LANGUAGE_STANDARD</key>
+				<string>gnu++0x</string>
+				<key>CLANG_CXX_LIBRARY</key>
+				<string>libc++</string>
+				<key>CLANG_ENABLE_OBJC_ARC</key>
+				<string>YES</string>
+				<key>CLANG_WARN_CONSTANT_CONVERSION</key>
+				<string>YES</string>
+				<key>CLANG_WARN_EMPTY_BODY</key>
+				<string>YES</string>
+				<key>CLANG_WARN_ENUM_CONVERSION</key>
+				<string>YES</string>
+				<key>CLANG_WARN_INT_CONVERSION</key>
+				<string>YES</string>
+				<key>CLANG_WARN__DUPLICATE_METHOD_MATCH</key>
+				<string>YES</string>
+				<key>CODE_SIGN_IDENTITY[sdk=iphoneos*]</key>
+				<string>iPhone Developer</string>
+				<key>COPY_PHASE_STRIP</key>
+				<string>NO</string>
+				<key>GCC_C_LANGUAGE_STANDARD</key>
+				<string>gnu99</string>
+				<key>GCC_DYNAMIC_NO_PIC</key>
+				<string>NO</string>
+				<key>GCC_OPTIMIZATION_LEVEL</key>
+				<string>0</string>
+				<key>GCC_PREPROCESSOR_DEFINITIONS</key>
+				<array>
+					<string>DEBUG=1</string>
+					<string>$(inherited)</string>
+				</array>
+				<key>GCC_SYMBOLS_PRIVATE_EXTERN</key>
+				<string>NO</string>
+				<key>GCC_WARN_ABOUT_RETURN_TYPE</key>
+				<string>YES</string>
+				<key>GCC_WARN_UNINITIALIZED_AUTOS</key>
+				<string>YES</string>
+				<key>GCC_WARN_UNUSED_VARIABLE</key>
+				<string>YES</string>
+				<key>IPHONEOS_DEPLOYMENT_TARGET</key>
+				<string>6.1</string>
+				<key>ONLY_ACTIVE_ARCH</key>
+				<string>YES</string>
+				<key>SDKROOT</key>
+				<string>iphoneos</string>
+			</dict>
+			<key>isa</key>
+			<string>XCBuildConfiguration</string>
+			<key>name</key>
+			<string>Debug</string>
+		</dict>
+		<key>CD7ADE76174315F400B5B281</key>
+		<dict>
+			<key>buildSettings</key>
+			<dict>
+				<key>ALWAYS_SEARCH_USER_PATHS</key>
+				<string>NO</string>
+				<key>CLANG_CXX_LANGUAGE_STANDARD</key>
+				<string>gnu++0x</string>
+				<key>CLANG_CXX_LIBRARY</key>
+				<string>libc++</string>
+				<key>CLANG_ENABLE_OBJC_ARC</key>
+				<string>YES</string>
+				<key>CLANG_WARN_CONSTANT_CONVERSION</key>
+				<string>YES</string>
+				<key>CLANG_WARN_EMPTY_BODY</key>
+				<string>YES</string>
+				<key>CLANG_WARN_ENUM_CONVERSION</key>
+				<string>YES</string>
+				<key>CLANG_WARN_INT_CONVERSION</key>
+				<string>YES</string>
+				<key>CLANG_WARN__DUPLICATE_METHOD_MATCH</key>
+				<string>YES</string>
+				<key>CODE_SIGN_IDENTITY[sdk=iphoneos*]</key>
+				<string>iPhone Developer</string>
+				<key>COPY_PHASE_STRIP</key>
+				<string>YES</string>
+				<key>GCC_C_LANGUAGE_STANDARD</key>
+				<string>gnu99</string>
+				<key>GCC_WARN_ABOUT_RETURN_TYPE</key>
+				<string>YES</string>
+				<key>GCC_WARN_UNINITIALIZED_AUTOS</key>
+				<string>YES</string>
+				<key>GCC_WARN_UNUSED_VARIABLE</key>
+				<string>YES</string>
+				<key>IPHONEOS_DEPLOYMENT_TARGET</key>
+				<string>6.1</string>
+				<key>OTHER_CFLAGS</key>
+				<string>-DNS_BLOCK_ASSERTIONS=1</string>
+				<key>SDKROOT</key>
+				<string>iphoneos</string>
+				<key>VALIDATE_PRODUCT</key>
+				<string>YES</string>
+			</dict>
+			<key>isa</key>
+			<string>XCBuildConfiguration</string>
+			<key>name</key>
+			<string>Release</string>
+		</dict>
+		<key>CD7ADE77174315F400B5B281</key>
+		<dict>
+			<key>buildConfigurations</key>
+			<array>
+				<string>CD7ADE78174315F400B5B281</string>
+				<string>CD7ADE79174315F400B5B281</string>
+			</array>
+			<key>defaultConfigurationIsVisible</key>
+			<string>0</string>
+			<key>isa</key>
+			<string>XCConfigurationList</string>
+		</dict>
+		<key>CD7ADE78174315F400B5B281</key>
+		<dict>
+			<key>buildSettings</key>
+			<dict>
+				<key>GCC_PRECOMPILE_PREFIX_HEADER</key>
+				<string>YES</string>
+				<key>GCC_PREFIX_HEADER</key>
+				<string>MovieLibrary/MovieLibrary-Prefix.pch</string>
+				<key>INFOPLIST_FILE</key>
+				<string>MovieLibrary/MovieLibrary-Info.plist</string>
+				<key>PRODUCT_NAME</key>
+				<string>$(TARGET_NAME)</string>
+				<key>WRAPPER_EXTENSION</key>
+				<string>app</string>
+			</dict>
+			<key>isa</key>
+			<string>XCBuildConfiguration</string>
+			<key>name</key>
+			<string>Debug</string>
+		</dict>
+		<key>CD7ADE79174315F400B5B281</key>
+		<dict>
+			<key>buildSettings</key>
+			<dict>
+				<key>GCC_PRECOMPILE_PREFIX_HEADER</key>
+				<string>YES</string>
+				<key>GCC_PREFIX_HEADER</key>
+				<string>MovieLibrary/MovieLibrary-Prefix.pch</string>
+				<key>INFOPLIST_FILE</key>
+				<string>MovieLibrary/MovieLibrary-Info.plist</string>
+				<key>PRODUCT_NAME</key>
+				<string>$(TARGET_NAME)</string>
+				<key>WRAPPER_EXTENSION</key>
+				<string>app</string>
+			</dict>
+			<key>isa</key>
+			<string>XCBuildConfiguration</string>
+			<key>name</key>
+			<string>Release</string>
+		</dict>
+		<key>CD7ADE7A174315F400B5B281</key>
+		<dict>
+			<key>buildConfigurations</key>
+			<array>
+				<string>CD7ADE7B174315F400B5B281</string>
+				<string>CD7ADE7C174315F400B5B281</string>
+			</array>
+			<key>defaultConfigurationIsVisible</key>
+			<string>0</string>
+			<key>isa</key>
+			<string>XCConfigurationList</string>
+		</dict>
+		<key>CD7ADE7B174315F400B5B281</key>
+		<dict>
+			<key>baseConfigurationReference</key>
+			<string>D91DCCBA6E0B41B789B58675</string>
+			<key>buildSettings</key>
+			<dict>
+				<key>BUNDLE_LOADER</key>
+				<string>$(BUILT_PRODUCTS_DIR)/MovieLibrary.app/MovieLibrary</string>
+				<key>FRAMEWORK_SEARCH_PATHS</key>
+				<array>
+					<string>"$(SDKROOT)/Developer/Library/Frameworks"</string>
+					<string>"$(DEVELOPER_LIBRARY_DIR)/Frameworks"</string>
+				</array>
+				<key>GCC_PRECOMPILE_PREFIX_HEADER</key>
+				<string>YES</string>
+				<key>GCC_PREFIX_HEADER</key>
+				<string>MovieLibrary/MovieLibrary-Prefix.pch</string>
+				<key>INFOPLIST_FILE</key>
+				<string>MovieLibraryTests/MovieLibraryTests-Info.plist</string>
+				<key>PRODUCT_NAME</key>
+				<string>$(TARGET_NAME)</string>
+				<key>TEST_HOST</key>
+				<string>$(BUNDLE_LOADER)</string>
+				<key>WRAPPER_EXTENSION</key>
+				<string>octest</string>
+			</dict>
+			<key>isa</key>
+			<string>XCBuildConfiguration</string>
+			<key>name</key>
+			<string>Debug</string>
+		</dict>
+		<key>CD7ADE7C174315F400B5B281</key>
+		<dict>
+			<key>baseConfigurationReference</key>
+			<string>D91DCCBA6E0B41B789B58675</string>
+			<key>buildSettings</key>
+			<dict>
+				<key>BUNDLE_LOADER</key>
+				<string>$(BUILT_PRODUCTS_DIR)/MovieLibrary.app/MovieLibrary</string>
+				<key>FRAMEWORK_SEARCH_PATHS</key>
+				<array>
+					<string>"$(SDKROOT)/Developer/Library/Frameworks"</string>
+					<string>"$(DEVELOPER_LIBRARY_DIR)/Frameworks"</string>
+				</array>
+				<key>GCC_PRECOMPILE_PREFIX_HEADER</key>
+				<string>YES</string>
+				<key>GCC_PREFIX_HEADER</key>
+				<string>MovieLibrary/MovieLibrary-Prefix.pch</string>
+				<key>INFOPLIST_FILE</key>
+				<string>MovieLibraryTests/MovieLibraryTests-Info.plist</string>
+				<key>PRODUCT_NAME</key>
+				<string>$(TARGET_NAME)</string>
+				<key>TEST_HOST</key>
+				<string>$(BUNDLE_LOADER)</string>
+				<key>WRAPPER_EXTENSION</key>
+				<string>octest</string>
+			</dict>
+			<key>isa</key>
+			<string>XCBuildConfiguration</string>
+			<key>name</key>
+			<string>Release</string>
+		</dict>
+		<key>D91DCCBA6E0B41B789B58675</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>text.xcconfig</string>
+			<key>name</key>
+			<string>Pods-MovieLibraryTests.xcconfig</string>
+			<key>path</key>
+			<string>Pods/Pods-MovieLibraryTests.xcconfig</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+	</dict>
+	<key>rootObject</key>
+	<string>CD7ADE3D174315F400B5B281</string>
+</dict>
+</plist>
MovieLibrary.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,1 @@
+<?xml version='1.0' encoding='UTF-8'?><Workspace version='1.0'><FileRef location='group:MovieLibrary.xcodeproj'/><FileRef location='group:Pods/Pods.xcodeproj'/></Workspace>
\ No newline at end of file
Pods/BuildHeaders/Kiwi/Kiwi.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/Kiwi.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KiwiBlockMacros.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KiwiBlockMacros.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KiwiConfiguration.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KiwiConfiguration.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KiwiMacros.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KiwiMacros.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KiwiNewMacros.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KiwiNewMacros.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWAfterAllNode.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWAfterAllNode.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWAfterEachNode.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWAfterEachNode.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWAny.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWAny.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWAsyncVerifier.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWAsyncVerifier.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWBeBetweenMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWBeBetweenMatcher.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWBeEmptyMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWBeEmptyMatcher.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWBeforeAllNode.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWBeforeAllNode.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWBeforeEachNode.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWBeforeEachNode.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWBeIdenticalToMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWBeIdenticalToMatcher.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWBeKindOfClassMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWBeKindOfClassMatcher.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWBeMemberOfClassMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWBeMemberOfClassMatcher.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWBeNilMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWBeNilMatcher.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWBeNonNilMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWBeNonNilMatcher.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWBeSubclassOfClassMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWBeSubclassOfClassMatcher.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWBeTrueMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWBeTrueMatcher.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWBeWithinMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWBeWithinMatcher.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWBeZeroMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWBeZeroMatcher.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWBlock.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWBlock.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWBlockNode.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWBlockNode.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWBlockRaiseMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWBlockRaiseMatcher.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWCallSite.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWCallSite.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWCaptureSpy.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWCaptureSpy.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWChangeMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWChangeMatcher.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWConformToProtocolMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWConformToProtocolMatcher.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWContainMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWContainMatcher.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWContextNode.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWContextNode.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWCountType.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWCountType.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWDeviceInfo.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWDeviceInfo.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWEqualMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWEqualMatcher.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWExample.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWExample.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWExampleGroupBuilder.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWExampleGroupBuilder.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWExampleGroupDelegate.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWExampleGroupDelegate.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWExampleNode.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWExampleNode.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWExampleNodeVisitor.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWExampleNodeVisitor.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWExampleSuite.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWExampleSuite.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWExistVerifier.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWExistVerifier.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWExpectationType.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWExpectationType.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWFailure.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWFailure.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWFormatter.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWFormatter.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWFutureObject.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWFutureObject.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWGenericMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWGenericMatcher.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWGenericMatchEvaluator.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWGenericMatchEvaluator.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWGenericMatchingAdditions.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWGenericMatchingAdditions.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWHaveMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWHaveMatcher.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWHaveValueMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWHaveValueMatcher.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWInequalityMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWInequalityMatcher.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWIntercept.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWIntercept.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWInvocationCapturer.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWInvocationCapturer.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWItNode.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWItNode.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWMatcher.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWMatcherFactory.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWMatcherFactory.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWMatchers.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWMatchers.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWMatching.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWMatching.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWMatchVerifier.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWMatchVerifier.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWMessagePattern.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWMessagePattern.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWMessageSpying.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWMessageSpying.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWMessageTracker.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWMessageTracker.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWMock.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWMock.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWNull.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWNull.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWObjCUtilities.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWObjCUtilities.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWPendingNode.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWPendingNode.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWProbe.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWProbe.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWProbePoller.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWProbePoller.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWRaiseMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWRaiseMatcher.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWReceiveMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWReceiveMatcher.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWRegisterMatchersNode.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWRegisterMatchersNode.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWReporting.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWReporting.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWRespondToSelectorMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWRespondToSelectorMatcher.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWSpec.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWSpec.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWStringContainsMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWStringContainsMatcher.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWStringPrefixMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWStringPrefixMatcher.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWStringUtilities.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWStringUtilities.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWStub.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWStub.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWTestCase.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWTestCase.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWUserDefinedMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWUserDefinedMatcher.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWValue.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWValue.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWVerifying.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWVerifying.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/KWWorkarounds.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWWorkarounds.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/NSInvocation+KiwiAdditions.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/NSInvocation+KiwiAdditions.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/NSInvocation+OCMAdditions.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/NSInvocation+OCMAdditions.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/NSMethodSignature+KiwiAdditions.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/NSMethodSignature+KiwiAdditions.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/NSNumber+KiwiAdditions.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/NSNumber+KiwiAdditions.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/NSObject+KiwiMockAdditions.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/NSObject+KiwiMockAdditions.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/NSObject+KiwiSpyAdditions.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/NSObject+KiwiSpyAdditions.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/NSObject+KiwiStubAdditions.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/NSObject+KiwiStubAdditions.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/NSObject+KiwiVerifierAdditions.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/NSObject+KiwiVerifierAdditions.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/NSProxy+KiwiVerifierAdditions.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/NSProxy+KiwiVerifierAdditions.h
\ No newline at end of file
Pods/BuildHeaders/Kiwi/NSValue+KiwiAdditions.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/NSValue+KiwiAdditions.h
\ No newline at end of file
Pods/Headers/Kiwi/Kiwi.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/Kiwi.h
\ No newline at end of file
Pods/Headers/Kiwi/KiwiBlockMacros.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KiwiBlockMacros.h
\ No newline at end of file
Pods/Headers/Kiwi/KiwiConfiguration.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KiwiConfiguration.h
\ No newline at end of file
Pods/Headers/Kiwi/KiwiMacros.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KiwiMacros.h
\ No newline at end of file
Pods/Headers/Kiwi/KiwiNewMacros.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KiwiNewMacros.h
\ No newline at end of file
Pods/Headers/Kiwi/KWAfterAllNode.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWAfterAllNode.h
\ No newline at end of file
Pods/Headers/Kiwi/KWAfterEachNode.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWAfterEachNode.h
\ No newline at end of file
Pods/Headers/Kiwi/KWAny.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWAny.h
\ No newline at end of file
Pods/Headers/Kiwi/KWAsyncVerifier.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWAsyncVerifier.h
\ No newline at end of file
Pods/Headers/Kiwi/KWBeBetweenMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWBeBetweenMatcher.h
\ No newline at end of file
Pods/Headers/Kiwi/KWBeEmptyMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWBeEmptyMatcher.h
\ No newline at end of file
Pods/Headers/Kiwi/KWBeforeAllNode.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWBeforeAllNode.h
\ No newline at end of file
Pods/Headers/Kiwi/KWBeforeEachNode.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWBeforeEachNode.h
\ No newline at end of file
Pods/Headers/Kiwi/KWBeIdenticalToMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWBeIdenticalToMatcher.h
\ No newline at end of file
Pods/Headers/Kiwi/KWBeKindOfClassMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWBeKindOfClassMatcher.h
\ No newline at end of file
Pods/Headers/Kiwi/KWBeMemberOfClassMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWBeMemberOfClassMatcher.h
\ No newline at end of file
Pods/Headers/Kiwi/KWBeNilMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWBeNilMatcher.h
\ No newline at end of file
Pods/Headers/Kiwi/KWBeNonNilMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWBeNonNilMatcher.h
\ No newline at end of file
Pods/Headers/Kiwi/KWBeSubclassOfClassMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWBeSubclassOfClassMatcher.h
\ No newline at end of file
Pods/Headers/Kiwi/KWBeTrueMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWBeTrueMatcher.h
\ No newline at end of file
Pods/Headers/Kiwi/KWBeWithinMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWBeWithinMatcher.h
\ No newline at end of file
Pods/Headers/Kiwi/KWBeZeroMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWBeZeroMatcher.h
\ No newline at end of file
Pods/Headers/Kiwi/KWBlock.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWBlock.h
\ No newline at end of file
Pods/Headers/Kiwi/KWBlockNode.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWBlockNode.h
\ No newline at end of file
Pods/Headers/Kiwi/KWBlockRaiseMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWBlockRaiseMatcher.h
\ No newline at end of file
Pods/Headers/Kiwi/KWCallSite.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWCallSite.h
\ No newline at end of file
Pods/Headers/Kiwi/KWCaptureSpy.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWCaptureSpy.h
\ No newline at end of file
Pods/Headers/Kiwi/KWChangeMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWChangeMatcher.h
\ No newline at end of file
Pods/Headers/Kiwi/KWConformToProtocolMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWConformToProtocolMatcher.h
\ No newline at end of file
Pods/Headers/Kiwi/KWContainMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWContainMatcher.h
\ No newline at end of file
Pods/Headers/Kiwi/KWContextNode.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWContextNode.h
\ No newline at end of file
Pods/Headers/Kiwi/KWCountType.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWCountType.h
\ No newline at end of file
Pods/Headers/Kiwi/KWDeviceInfo.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWDeviceInfo.h
\ No newline at end of file
Pods/Headers/Kiwi/KWEqualMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWEqualMatcher.h
\ No newline at end of file
Pods/Headers/Kiwi/KWExample.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWExample.h
\ No newline at end of file
Pods/Headers/Kiwi/KWExampleGroupBuilder.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWExampleGroupBuilder.h
\ No newline at end of file
Pods/Headers/Kiwi/KWExampleGroupDelegate.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWExampleGroupDelegate.h
\ No newline at end of file
Pods/Headers/Kiwi/KWExampleNode.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWExampleNode.h
\ No newline at end of file
Pods/Headers/Kiwi/KWExampleNodeVisitor.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWExampleNodeVisitor.h
\ No newline at end of file
Pods/Headers/Kiwi/KWExampleSuite.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWExampleSuite.h
\ No newline at end of file
Pods/Headers/Kiwi/KWExistVerifier.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWExistVerifier.h
\ No newline at end of file
Pods/Headers/Kiwi/KWExpectationType.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWExpectationType.h
\ No newline at end of file
Pods/Headers/Kiwi/KWFailure.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWFailure.h
\ No newline at end of file
Pods/Headers/Kiwi/KWFormatter.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWFormatter.h
\ No newline at end of file
Pods/Headers/Kiwi/KWFutureObject.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWFutureObject.h
\ No newline at end of file
Pods/Headers/Kiwi/KWGenericMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWGenericMatcher.h
\ No newline at end of file
Pods/Headers/Kiwi/KWGenericMatchEvaluator.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWGenericMatchEvaluator.h
\ No newline at end of file
Pods/Headers/Kiwi/KWGenericMatchingAdditions.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWGenericMatchingAdditions.h
\ No newline at end of file
Pods/Headers/Kiwi/KWHaveMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWHaveMatcher.h
\ No newline at end of file
Pods/Headers/Kiwi/KWHaveValueMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWHaveValueMatcher.h
\ No newline at end of file
Pods/Headers/Kiwi/KWInequalityMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWInequalityMatcher.h
\ No newline at end of file
Pods/Headers/Kiwi/KWIntercept.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWIntercept.h
\ No newline at end of file
Pods/Headers/Kiwi/KWInvocationCapturer.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWInvocationCapturer.h
\ No newline at end of file
Pods/Headers/Kiwi/KWItNode.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWItNode.h
\ No newline at end of file
Pods/Headers/Kiwi/KWMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWMatcher.h
\ No newline at end of file
Pods/Headers/Kiwi/KWMatcherFactory.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWMatcherFactory.h
\ No newline at end of file
Pods/Headers/Kiwi/KWMatchers.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWMatchers.h
\ No newline at end of file
Pods/Headers/Kiwi/KWMatching.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWMatching.h
\ No newline at end of file
Pods/Headers/Kiwi/KWMatchVerifier.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWMatchVerifier.h
\ No newline at end of file
Pods/Headers/Kiwi/KWMessagePattern.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWMessagePattern.h
\ No newline at end of file
Pods/Headers/Kiwi/KWMessageSpying.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWMessageSpying.h
\ No newline at end of file
Pods/Headers/Kiwi/KWMessageTracker.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWMessageTracker.h
\ No newline at end of file
Pods/Headers/Kiwi/KWMock.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWMock.h
\ No newline at end of file
Pods/Headers/Kiwi/KWNull.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWNull.h
\ No newline at end of file
Pods/Headers/Kiwi/KWObjCUtilities.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWObjCUtilities.h
\ No newline at end of file
Pods/Headers/Kiwi/KWPendingNode.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWPendingNode.h
\ No newline at end of file
Pods/Headers/Kiwi/KWProbe.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWProbe.h
\ No newline at end of file
Pods/Headers/Kiwi/KWProbePoller.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWProbePoller.h
\ No newline at end of file
Pods/Headers/Kiwi/KWRaiseMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWRaiseMatcher.h
\ No newline at end of file
Pods/Headers/Kiwi/KWReceiveMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWReceiveMatcher.h
\ No newline at end of file
Pods/Headers/Kiwi/KWRegisterMatchersNode.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWRegisterMatchersNode.h
\ No newline at end of file
Pods/Headers/Kiwi/KWReporting.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWReporting.h
\ No newline at end of file
Pods/Headers/Kiwi/KWRespondToSelectorMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWRespondToSelectorMatcher.h
\ No newline at end of file
Pods/Headers/Kiwi/KWSpec.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWSpec.h
\ No newline at end of file
Pods/Headers/Kiwi/KWStringContainsMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWStringContainsMatcher.h
\ No newline at end of file
Pods/Headers/Kiwi/KWStringPrefixMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWStringPrefixMatcher.h
\ No newline at end of file
Pods/Headers/Kiwi/KWStringUtilities.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWStringUtilities.h
\ No newline at end of file
Pods/Headers/Kiwi/KWStub.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWStub.h
\ No newline at end of file
Pods/Headers/Kiwi/KWTestCase.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWTestCase.h
\ No newline at end of file
Pods/Headers/Kiwi/KWUserDefinedMatcher.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWUserDefinedMatcher.h
\ No newline at end of file
Pods/Headers/Kiwi/KWValue.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWValue.h
\ No newline at end of file
Pods/Headers/Kiwi/KWVerifying.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWVerifying.h
\ No newline at end of file
Pods/Headers/Kiwi/KWWorkarounds.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/KWWorkarounds.h
\ No newline at end of file
Pods/Headers/Kiwi/NSInvocation+KiwiAdditions.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/NSInvocation+KiwiAdditions.h
\ No newline at end of file
Pods/Headers/Kiwi/NSInvocation+OCMAdditions.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/NSInvocation+OCMAdditions.h
\ No newline at end of file
Pods/Headers/Kiwi/NSMethodSignature+KiwiAdditions.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/NSMethodSignature+KiwiAdditions.h
\ No newline at end of file
Pods/Headers/Kiwi/NSNumber+KiwiAdditions.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/NSNumber+KiwiAdditions.h
\ No newline at end of file
Pods/Headers/Kiwi/NSObject+KiwiMockAdditions.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/NSObject+KiwiMockAdditions.h
\ No newline at end of file
Pods/Headers/Kiwi/NSObject+KiwiSpyAdditions.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/NSObject+KiwiSpyAdditions.h
\ No newline at end of file
Pods/Headers/Kiwi/NSObject+KiwiStubAdditions.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/NSObject+KiwiStubAdditions.h
\ No newline at end of file
Pods/Headers/Kiwi/NSObject+KiwiVerifierAdditions.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/NSObject+KiwiVerifierAdditions.h
\ No newline at end of file
Pods/Headers/Kiwi/NSProxy+KiwiVerifierAdditions.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/NSProxy+KiwiVerifierAdditions.h
\ No newline at end of file
Pods/Headers/Kiwi/NSValue+KiwiAdditions.h
@@ -0,0 +1,1 @@
+../../Kiwi/Classes/NSValue+KiwiAdditions.h
\ No newline at end of file
Pods/Kiwi/Classes/Kiwi.h
@@ -0,0 +1,100 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+// This needs to come first.
+#import "KiwiConfiguration.h"
+#import <SenTestingKit/SenTestingKit.h>
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+#import "KWAfterAllNode.h"
+#import "KWAfterEachNode.h"
+#import "KWAny.h"
+#import "KWAsyncVerifier.h"
+#import "KWBeBetweenMatcher.h"
+#import "KWBeEmptyMatcher.h"
+#import "KWBeIdenticalToMatcher.h"
+#import "KWBeKindOfClassMatcher.h"
+#import "KWBeMemberOfClassMatcher.h"
+#import "KWBeSubclassOfClassMatcher.h"
+#import "KWBeTrueMatcher.h"
+#import "KWBeNilMatcher.h"
+#import "KWBeNonNilMatcher.h"
+#import "KWBeWithinMatcher.h"
+#import "KWBeZeroMatcher.h"
+#import "KWBeforeAllNode.h"
+#import "KWBeforeEachNode.h"
+#import "KWBlock.h"
+#import "KWBlockNode.h"
+#import "KWBlockRaiseMatcher.h"
+#import "KWCallSite.h"
+#import "KWChangeMatcher.h"
+#import "KWConformToProtocolMatcher.h"
+#import "KWContainMatcher.h"
+#import "KWContextNode.h"
+#import "KWDeviceInfo.h"
+#import "KWEqualMatcher.h"
+#import "KWExample.h"
+#import "KWExampleGroupBuilder.h"
+#import "KWExampleNode.h"
+#import "KWExampleNodeVisitor.h"
+#import "KWExistVerifier.h"
+#import "KWExpectationType.h"
+#import "KWFailure.h"
+#import "KWFormatter.h"
+#import "KWFutureObject.h"
+#import "KWGenericMatcher.h"
+#import "KWHaveMatcher.h"
+#import "KWHaveValueMatcher.h"
+#import "KWInequalityMatcher.h"
+#import "KWInvocationCapturer.h"
+#import "KWItNode.h"
+#import "KWMatchVerifier.h"
+#import "KWMatcher.h"
+#import "KWMatchers.h"
+#import "KWMatcherFactory.h"
+#import "KWMatching.h"
+#import "KWMessagePattern.h"
+#import "KWMessageSpying.h"
+#import "KWMock.h"
+#import "KWNull.h"
+#import "KWObjCUtilities.h"
+#import "KWPendingNode.h"
+#import "KWRaiseMatcher.h"
+#import "KWReceiveMatcher.h"
+#import "KWRegisterMatchersNode.h"
+#import "KWRespondToSelectorMatcher.h"
+#import "KWSpec.h"
+#import "KWStringUtilities.h"
+#import "KWStub.h"
+#import "KWTestCase.h"
+#import "KWUserDefinedMatcher.h"
+#import "KWValue.h"
+#import "KWVerifying.h"
+#import "KWCaptureSpy.h"
+#import "KWStringPrefixMatcher.h"
+#import "KWStringContainsMatcher.h"
+
+  
+// Public Foundation Categories
+#import "NSObject+KiwiMockAdditions.h"
+#import "NSObject+KiwiSpyAdditions.h"
+#import "NSObject+KiwiStubAdditions.h"
+#import "NSObject+KiwiVerifierAdditions.h"
+
+#import "KiwiMacros.h"
+
+// Some Foundation headers use Kiwi keywords (e.g. 'should') as identifiers for
+// parameter names. Including this last allows the use of Kiwi keywords without
+// conflicting with these headers (hopefully!).
+#import "KiwiBlockMacros.h"
+
+#if defined(__cplusplus)
+}
+#endif
+
Pods/Kiwi/Classes/KiwiBlockMacros.h
@@ -0,0 +1,16 @@
+//
+//  KiwiBlockMacros.h
+//  Kiwi
+//
+//  Created by Luke Redpath on 11/07/2011.
+//  Copyright 2011 Allen Ding. All rights reserved.
+//
+
+// user defined matchers
+#define registerMatcher(name) \
+\
+@interface NSObject (KWUserDefinedMatchersDefinitions) \
+- (void)name; \
+@end \
+
+#define defineMatcher(...) KWDefineMatchers(__VA_ARGS__)
Pods/Kiwi/Classes/KiwiConfiguration.h
@@ -0,0 +1,28 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+#define KW_VERSION 0.9001
+
+// Blocks being unavailable cripples the usability of Kiwi, but is supported
+// because they are not available on anything less than a device running 3.2.
+#if !defined(__BLOCKS__)
+#error "Kiwi requires blocks support."
+#endif
+
+// As of iPhone SDK 4 GM, exceptions thrown across an NSInvocation -invoke or
+// forwardInvocation: boundary in the simulator will terminate the app instead
+// of being caught in @catch blocks from the caller side of the -invoke. Kiwi
+// tries to handle this by storing the first exception that it would have
+// otherwise thrown in a nasty global that callers can look for and handle.
+// (Buggy termination is less desirable than global variables).
+//
+// Obviously, this can only handles cases where Kiwi itself would have raised
+// an exception.
+#if TARGET_IPHONE_SIMULATOR
+    #define KW_TARGET_HAS_INVOCATION_EXCEPTION_BUG 1
+#endif
Pods/Kiwi/Classes/KiwiMacros.h
@@ -0,0 +1,80 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+
+// This category is solely meant to coax Xcode into exposing the method names below during autocompletion.
+// There is no implementation and this class definition must come before the macro definitions below.
+@interface NSObject (KiwiVerifierMacroNames)
+
+- (void)should;
+- (void)shouldNot;
+- (void)shouldBeNil;
+- (void)shouldNotBeNil;
+- (void)shouldEventually;
+- (void)shouldEventuallyBeforeTimingOutAfter;
+
+@end
+
+#pragma mark -
+#pragma mark Support Macros
+
+#define KW_THIS_CALLSITE [KWCallSite callSiteWithFilename:@__FILE__ lineNumber:__LINE__]
+#define KW_ADD_EXIST_VERIFIER(expectationType) [self addExistVerifierWithExpectationType:expectationType callSite:KW_THIS_CALLSITE]
+#define KW_ADD_MATCH_VERIFIER(expectationType) [self addMatchVerifierWithExpectationType:expectationType callSite:KW_THIS_CALLSITE]
+#define KW_ADD_ASYNC_VERIFIER(expectationType, timeOut) [self addAsyncVerifierWithExpectationType:expectationType callSite:KW_THIS_CALLSITE timeout:timeOut]
+
+#pragma mark -
+#pragma mark Keywords
+
+// Kiwi macros used in specs for verifying expectations.
+#define should attachToVerifier:KW_ADD_MATCH_VERIFIER(KWExpectationTypeShould) verifier:KW_ADD_EXIST_VERIFIER(KWExpectationTypeShould)
+#define shouldNot attachToVerifier:KW_ADD_MATCH_VERIFIER(KWExpectationTypeShouldNot) verifier:KW_ADD_EXIST_VERIFIER(KWExpectationTypeShould)
+#define shouldBeNil attachToVerifier:KW_ADD_EXIST_VERIFIER(KWExpectationTypeShouldNot)
+#define shouldNotBeNil attachToVerifier:KW_ADD_EXIST_VERIFIER(KWExpectationTypeShould)
+#define shouldEventually attachToVerifier:KW_ADD_ASYNC_VERIFIER(KWExpectationTypeShould, kKW_DEFAULT_PROBE_TIMEOUT)
+#define shouldEventuallyBeforeTimingOutAfter(timeout) attachToVerifier:KW_ADD_ASYNC_VERIFIER(KWExpectationTypeShould, timeout)
+
+// waitFor is like a shouldEventually but will not fail if it's never satisfied
+#define waitFor attachToVerifier:KW_ADD_ASYNC_VERIFIER(KWExpectationTypeMaybe, kKW_DEFAULT_PROBE_TIMEOUT)
+
+// used to wrap a pointer to an object that will change in the future (used with shouldEventually)
+#define theObject(objectPtr) [KWFutureObject objectWithObjectPointer:objectPtr] // DEPRECATED
+#define theReturnValueOfBlock(block) [KWFutureObject futureObjectWithBlock:block] // DEPRECATED
+#define expectFutureValue(futureValue) [KWFutureObject futureObjectWithBlock:^{ return futureValue; }]
+
+// used for message patterns to allow matching any value
+#define any() [KWAny any]
+
+// If a gcc compatible compiler is available, use the statement and
+// declarations in expression extension to provide a convenient catch-all macro
+// to create KWValues.
+#if defined(__GNUC__)
+    #define theValue(expr) \
+        ({ \
+            __typeof__(expr) kiwiReservedPrefix_lVar = expr; \
+            [KWValue valueWithBytes:&kiwiReservedPrefix_lVar objCType:@encode(__typeof__(expr))]; \
+        })
+#endif // #if defined(__GNUC__)
+
+// Allows for comparision of pointer values in expectations
+#define thePointerValue(expr) [NSValue valueWithPointer:(expr)]
+
+// Example group declarations.
+#define SPEC_BEGIN(name) \
+    \
+    @interface name : KWSpec \
+    \
+    @end \
+    \
+    @implementation name \
+    \
+    + (void)buildExampleGroups { \
+
+#define SPEC_END \
+    } \
+    \
+    @end
Pods/Kiwi/Classes/KiwiNewMacros.h
@@ -0,0 +1,10 @@
+//
+//  KiwiNewMacros.h
+//  Kiwi
+//
+//  Created by Luke Redpath on 11/07/2011.
+//  Copyright 2011 Allen Ding. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
Pods/Kiwi/Classes/KWAfterAllNode.h
@@ -0,0 +1,18 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+#import "KWBlockNode.h"
+#import "KWExampleNode.h"
+
+@interface KWAfterAllNode : KWBlockNode<KWExampleNode>
+
+#pragma mark -
+#pragma mark Initializing
+
++ (id)afterAllNodeWithCallSite:(KWCallSite *)aCallSite block:(KWVoidBlock)aBlock;
+
+@end
Pods/Kiwi/Classes/KWAfterAllNode.m
@@ -0,0 +1,26 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWAfterAllNode.h"
+#import "KWExampleNodeVisitor.h"
+
+@implementation KWAfterAllNode
+
+#pragma mark -
+#pragma mark Initializing
+
++ (id)afterAllNodeWithCallSite:(KWCallSite *)aCallSite block:(KWVoidBlock)aBlock {
+    return [[[self alloc] initWithCallSite:aCallSite description:nil block:aBlock] autorelease];
+}
+
+#pragma mark -
+#pragma mark Accepting Visitors
+
+- (void)acceptExampleNodeVisitor:(id<KWExampleNodeVisitor>)aVisitor {
+    [aVisitor visitAfterAllNode:self];
+}
+
+@end
Pods/Kiwi/Classes/KWAfterEachNode.h
@@ -0,0 +1,18 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+#import "KWBlockNode.h"
+#import "KWExampleNode.h"
+
+@interface KWAfterEachNode : KWBlockNode<KWExampleNode>
+
+#pragma mark -
+#pragma mark Initializing
+
++ (id)afterEachNodeWithCallSite:(KWCallSite *)aCallSite block:(KWVoidBlock)aBlock;
+
+@end
Pods/Kiwi/Classes/KWAfterEachNode.m
@@ -0,0 +1,26 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWAfterEachNode.h"
+#import "KWExampleNodeVisitor.h"
+
+@implementation KWAfterEachNode
+
+#pragma mark -
+#pragma mark Initializing
+
++ (id)afterEachNodeWithCallSite:(KWCallSite *)aCallSite block:(KWVoidBlock)aBlock {
+    return [[[self alloc] initWithCallSite:aCallSite description:nil block:aBlock] autorelease];
+}
+
+#pragma mark -
+#pragma mark Accepting Visitors
+
+- (void)acceptExampleNodeVisitor:(id<KWExampleNodeVisitor>)aVisitor {
+    [aVisitor visitAfterEachNode:self];
+}
+
+@end
Pods/Kiwi/Classes/KWAny.h
@@ -0,0 +1,18 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+
+// KWAny exists to determine arguments in a message pattern that should
+// match any value. Used for pointers as well as for scalar values.
+@interface KWAny : NSObject
+
+#pragma mark -
+#pragma mark Initializing
+
++ (id)any;
+
+@end
Pods/Kiwi/Classes/KWAny.m
@@ -0,0 +1,47 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWAny.h"
+
+@implementation KWAny
+
+#pragma mark -
+#pragma mark Initializing
+
+static KWAny *sharedAny = nil;
+
++ (id)any {
+    if (sharedAny == nil) {
+        sharedAny = [[super allocWithZone:nil] init];
+    }
+
+    return sharedAny;
+}
+
++ (id)allocWithZone:(NSZone *)zone {
+    return [[self any] retain];
+}
+
+- (id)copyWithZone:(NSZone *)zone {
+    return self;
+}
+
+- (id)retain {
+    return self;
+}
+
+- (NSUInteger)retainCount {
+    return NSUIntegerMax;
+}
+
+- (oneway void)release {
+}
+
+- (id)autorelease {
+    return self;
+}
+
+@end
Pods/Kiwi/Classes/KWAsyncVerifier.h
@@ -0,0 +1,35 @@
+//
+//  KWAsyncVerifier.h
+//  iOSFalconCore
+//
+//  Created by Luke Redpath on 13/01/2011.
+//  Copyright 2011 LJR Software Limited. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+#import "KWMatchVerifier.h"
+#import "KWProbe.h"
+
+#define kKW_DEFAULT_PROBE_TIMEOUT 1.0
+
+@class KWAsyncMatcherProbe;
+
+@interface KWAsyncVerifier : KWMatchVerifier
+{
+  NSTimeInterval timeout;
+}
+@property (nonatomic, assign) NSTimeInterval timeout;
+
++ (id)asyncVerifierWithExpectationType:(KWExpectationType)anExpectationType callSite:(KWCallSite *)aCallSite matcherFactory:(KWMatcherFactory *)aMatcherFactory reporter:(id<KWReporting>)aReporter probeTimeout:(NSTimeInterval)probeTimeout;
+- (void)verifyWithProbe:(KWAsyncMatcherProbe *)aProbe;
+@end
+
+@interface KWAsyncMatcherProbe : NSObject <KWProbe>
+{
+  id<KWMatching> matcher;
+  BOOL matchResult;
+}
+@property (nonatomic, readonly) id<KWMatching> matcher;
+
+- (id)initWithMatcher:(id<KWMatching>)aMatcher;
+@end
Pods/Kiwi/Classes/KWAsyncVerifier.m
@@ -0,0 +1,99 @@
+//
+//  KWAsyncVerifier.m
+//  iOSFalconCore
+//
+//  Created by Luke Redpath on 13/01/2011.
+//  Copyright 2011 LJR Software Limited. All rights reserved.
+//
+
+#import "KWAsyncVerifier.h"
+#import "KWFailure.h"
+#import "KWMatching.h"
+#import "KWReporting.h"
+#import "KWProbePoller.h"
+
+@implementation KWAsyncVerifier
+
+@synthesize timeout;
+
++ (id)asyncVerifierWithExpectationType:(KWExpectationType)anExpectationType callSite:(KWCallSite *)aCallSite matcherFactory:(KWMatcherFactory *)aMatcherFactory reporter:(id<KWReporting>)aReporter probeTimeout:(NSTimeInterval)probeTimeout;
+{
+  KWAsyncVerifier *verifier = [[self alloc] initWithExpectationType:anExpectationType callSite:aCallSite matcherFactory:aMatcherFactory reporter:aReporter];
+  verifier.timeout = probeTimeout;
+  return [verifier autorelease];
+}
+
+- (id)initWithExpectationType:(KWExpectationType)anExpectationType callSite:(KWCallSite *)aCallSite matcherFactory:(KWMatcherFactory *)aMatcherFactory reporter:(id<KWReporting>)aReporter {
+  if ((self = [super initWithExpectationType:anExpectationType callSite:aCallSite matcherFactory:aMatcherFactory reporter:aReporter])) {
+    self.timeout = kKW_DEFAULT_PROBE_TIMEOUT;
+  }
+  return self;
+}
+
+- (void)verifyWithProbe:(KWAsyncMatcherProbe *)aProbe {
+  @try {
+    KWProbePoller *poller = [[KWProbePoller alloc] initWithTimeout:self.timeout delay:kKW_DEFAULT_PROBE_DELAY];
+
+    if (![poller check:aProbe]) {
+      if (self.expectationType == KWExpectationTypeShould) {
+        NSString *message = [aProbe.matcher failureMessageForShould];
+        KWFailure *failure = [KWFailure failureWithCallSite:self.callSite message:message];
+        [self.reporter reportFailure:failure];
+      } else if (self.expectationType == KWExpectationTypeShouldNot) {
+        NSString *message = [aProbe.matcher failureMessageForShouldNot];
+        KWFailure *failure = [KWFailure failureWithCallSite:self.callSite message:message];
+        [self.reporter reportFailure:failure];
+      } else if (self.expectationType == KWExpectationTypeMaybe) {
+        // don't do anything
+      }
+    }
+    [poller release];
+
+  } @catch (NSException *exception) {
+    KWFailure *failure = [KWFailure failureWithCallSite:self.callSite message:[exception description]];
+    [self.reporter reportFailure:failure];
+  }
+}
+
+- (void)verifyWithMatcher:(id<KWMatching>)aMatcher {
+  KWAsyncMatcherProbe *probe = [[[KWAsyncMatcherProbe alloc] initWithMatcher:aMatcher] autorelease];
+  [self verifyWithProbe:probe];
+}
+
+@end
+
+@implementation KWAsyncMatcherProbe
+
+@synthesize matcher;
+
+- (id)initWithMatcher:(id<KWMatching>)aMatcher;
+{
+  if ((self = [super init])) {
+    matcher = [aMatcher retain];
+
+    // make sure the matcher knows we are going to evaluate it multiple times
+    if ([aMatcher respondsToSelector:@selector(willEvaluateMultipleTimes)]) {
+      [aMatcher setWillEvaluateMultipleTimes:YES];
+    }
+  }
+  return self;
+}
+
+- (void)dealloc
+{
+  [matcher release];
+  [super dealloc];
+}
+
+- (BOOL)isSatisfied;
+{
+  return matchResult;
+}
+
+- (void)sample;
+{
+  matchResult = [matcher evaluate];
+}
+
+@end
+
Pods/Kiwi/Classes/KWBeBetweenMatcher.h
@@ -0,0 +1,23 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+#import "KWMatcher.h"
+
+@interface KWBeBetweenMatcher : KWMatcher {
+@private
+    id lowerEndpoint;
+    id upperEndpoint;
+}
+
+#pragma mark -
+#pragma mark Configuring Matchers
+
+// TODO: 'and' below is a reserved word in C++
+- (void)beBetween:(id)aLowerEndpoint and:(id)anUpperEndpoint;
+- (void)beInTheIntervalFrom:(id)aLowerEndpoint to:(id)anUpperEndpoint;
+
+@end
Pods/Kiwi/Classes/KWBeBetweenMatcher.m
@@ -0,0 +1,84 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWBeBetweenMatcher.h"
+#import "KWFormatter.h"
+
+@interface KWBeBetweenMatcher()
+
+#pragma mark -
+#pragma mark Properties
+
+@property (nonatomic, readwrite, retain) id lowerEndpoint;
+@property (nonatomic, readwrite, retain) id upperEndpoint;
+
+@end
+
+@implementation KWBeBetweenMatcher
+
+#pragma mark -
+#pragma mark Initializing
+
+- (void)dealloc {
+    [lowerEndpoint release];
+    [upperEndpoint release];
+    [super dealloc];
+}
+
+#pragma mark -
+#pragma mark Properties
+
+@synthesize lowerEndpoint;
+@synthesize upperEndpoint;
+
+#pragma mark -
+#pragma mark Getting Matcher Strings
+
++ (NSArray *)matcherStrings {
+    return @[@"beBetween:and:", @"beInTheIntervalFrom:to:"];
+}
+
+#pragma mark -
+#pragma mark Matching
+
+- (BOOL)evaluate {
+    if (![self.subject respondsToSelector:@selector(compare:)])
+        [NSException raise:@"KWMatcherException" format:@"subject does not respond to -compare:"];
+
+    NSComparisonResult lowerResult = [self.subject compare:self.lowerEndpoint];
+    NSComparisonResult upperResult = [self.subject compare:self.upperEndpoint];
+    return (lowerResult == NSOrderedDescending || lowerResult == NSOrderedSame) &&
+           (upperResult == NSOrderedAscending || upperResult == NSOrderedSame);
+}
+
+#pragma mark -
+#pragma mark Getting Failure Messages
+
+- (NSString *)failureMessageForShould {
+    return [NSString stringWithFormat:@"expected subject to be in the interval [%@, %@], got %@",
+                                      [KWFormatter formatObject:self.lowerEndpoint],
+                                      [KWFormatter formatObject:self.upperEndpoint],
+                                      [KWFormatter formatObject:self.subject]];
+}
+
+- (NSString *)description
+{
+  return [NSString stringWithFormat:@"be between %@ and %@", self.lowerEndpoint, self.upperEndpoint];
+}
+
+#pragma mark -
+#pragma mark Configuring Matchers
+
+- (void)beBetween:(id)aLowerEndpoint and:(id)anUpperEndpoint {
+    [self beInTheIntervalFrom:aLowerEndpoint to:anUpperEndpoint];
+}
+
+- (void)beInTheIntervalFrom:(id)aLowerEndpoint to:(id)anUpperEndpoint {
+    self.lowerEndpoint = aLowerEndpoint;
+    self.upperEndpoint = anUpperEndpoint;
+}
+
+@end
Pods/Kiwi/Classes/KWBeEmptyMatcher.h
@@ -0,0 +1,20 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+#import "KWMatcher.h"
+
+@interface KWBeEmptyMatcher : KWMatcher {
+@private
+    NSUInteger count;
+}
+
+#pragma mark -
+#pragma mark Configuring Matchers
+
+- (void)beEmpty;
+
+@end
Pods/Kiwi/Classes/KWBeEmptyMatcher.m
@@ -0,0 +1,79 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWBeEmptyMatcher.h"
+#import "KWFormatter.h"
+
+@interface KWBeEmptyMatcher()
+
+#pragma mark -
+#pragma mark Properties
+
+@property (nonatomic, readwrite) NSUInteger count;
+
+@end
+
+@implementation KWBeEmptyMatcher
+
+#pragma mark -
+#pragma mark Properties
+
+@synthesize count;
+
+#pragma mark -
+#pragma mark Getting Matcher Strings
+
++ (NSArray *)matcherStrings {
+    return @[@"beEmpty"];
+}
+
+#pragma mark -
+#pragma mark Matching
+
+- (BOOL)evaluate {
+    if ([self.subject respondsToSelector:@selector(count)]) {
+        self.count = [self.subject count];
+        return self.count == 0;
+    }
+    else if ([self.subject respondsToSelector:@selector(length)]) {
+        self.count = [self.subject length];
+        return self.count == 0;
+    }
+
+    [NSException raise:@"KWMatcherException" format:@"subject does not respond to -count or -length"];
+    return NO;
+}
+
+#pragma mark -
+#pragma mark Getting Failure Messages
+
+- (NSString *)countPhrase {
+    if (self.count == 1)
+        return @"1 item";
+    else
+        return [NSString stringWithFormat:@"%u items", (unsigned)self.count];
+}
+
+- (NSString *)failureMessageForShould {
+    return [NSString stringWithFormat:@"expected subject to be empty, got %@", [self countPhrase]];
+}
+
+- (NSString *)failureMessageForShouldNot {
+    return @"expected subject not to be empty";
+}
+
+- (NSString *)description
+{
+  return @"be empty";
+}
+
+#pragma mark -
+#pragma mark Configuring Matchers
+
+- (void)beEmpty {
+}
+
+@end
Pods/Kiwi/Classes/KWBeforeAllNode.h
@@ -0,0 +1,18 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+#import "KWBlockNode.h"
+#import "KWExampleNode.h"
+
+@interface KWBeforeAllNode : KWBlockNode<KWExampleNode>
+
+#pragma mark -
+#pragma mark Initializing
+
++ (id)beforeAllNodeWithCallSite:(KWCallSite *)aCallSite block:(KWVoidBlock)aBlock;
+
+@end
Pods/Kiwi/Classes/KWBeforeAllNode.m
@@ -0,0 +1,26 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWBeforeAllNode.h"
+#import "KWExampleNodeVisitor.h"
+
+@implementation KWBeforeAllNode
+
+#pragma mark -
+#pragma mark Initializing
+
++ (id)beforeAllNodeWithCallSite:(KWCallSite *)aCallSite block:(KWVoidBlock)aBlock {
+    return [[[self alloc] initWithCallSite:aCallSite description:nil block:aBlock] autorelease];
+}
+
+#pragma mark -
+#pragma mark Accepting Visitors
+
+- (void)acceptExampleNodeVisitor:(id<KWExampleNodeVisitor>)aVisitor {
+    [aVisitor visitBeforeAllNode:self];
+}
+
+@end
Pods/Kiwi/Classes/KWBeforeEachNode.h
@@ -0,0 +1,18 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+#import "KWBlockNode.h"
+#import "KWExampleNode.h"
+
+@interface KWBeforeEachNode : KWBlockNode<KWExampleNode>
+
+#pragma mark -
+#pragma mark Initializing
+
++ (id)beforeEachNodeWithCallSite:(KWCallSite *)aCallSite block:(KWVoidBlock)aBlock;
+
+@end
Pods/Kiwi/Classes/KWBeforeEachNode.m
@@ -0,0 +1,26 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWBeforeEachNode.h"
+#import "KWExampleNodeVisitor.h"
+
+@implementation KWBeforeEachNode
+
+#pragma mark -
+#pragma mark Initializing
+
++ (id)beforeEachNodeWithCallSite:(KWCallSite *)aCallSite block:(KWVoidBlock)aBlock {
+    return [[[self alloc] initWithCallSite:aCallSite description:nil block:aBlock] autorelease];
+}
+
+#pragma mark -
+#pragma mark Accepting Visitors
+
+- (void)acceptExampleNodeVisitor:(id<KWExampleNodeVisitor>)aVisitor {
+    [aVisitor visitBeforeEachNode:self];
+}
+
+@end
Pods/Kiwi/Classes/KWBeIdenticalToMatcher.h
@@ -0,0 +1,20 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+#import "KWMatcher.h"
+
+@interface KWBeIdenticalToMatcher : KWMatcher {
+@private
+    id otherSubject;
+}
+
+#pragma mark -
+#pragma mark Configuring Matchers
+
+- (void)beIdenticalTo:(id)anObject;
+
+@end
Pods/Kiwi/Classes/KWBeIdenticalToMatcher.m
@@ -0,0 +1,77 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWBeIdenticalToMatcher.h"
+#import "KWFormatter.h"
+
+@interface KWBeIdenticalToMatcher()
+
+#pragma mark -
+#pragma mark Properties
+
+@property (nonatomic, readwrite, retain) id otherSubject;
+
+@end
+
+@implementation KWBeIdenticalToMatcher
+
+#pragma mark -
+#pragma mark Initializing
+
+- (void)dealloc {
+    [otherSubject release];
+    [super dealloc];
+}
+
+#pragma mark -
+#pragma mark Properties
+
+@synthesize otherSubject;
+
+#pragma mark -
+#pragma mark Getting Matcher Strings
+
++ (NSArray *)matcherStrings {
+    return @[@"beIdenticalTo:"];
+}
+
+#pragma mark -
+#pragma mark Matching
+
+- (BOOL)evaluate {
+    return self.subject == self.otherSubject;
+}
+
+#pragma mark -
+#pragma mark Getting Failure Messages
+
+- (NSString *)failureMessageForShould {
+    return [NSString stringWithFormat:@"expected subject to be identical to %@ (%p), got %@ (%p)",
+                                      [KWFormatter formatObject:self.otherSubject],
+                                      self.otherSubject,
+                                      [KWFormatter formatObject:self.subject],
+                                      self.subject];
+}
+
+- (NSString *)failureMessageForShouldNot {
+    return [NSString stringWithFormat:@"expected subject not to be identical to %@ (%p)",
+                                      [KWFormatter formatObject:self.otherSubject],
+                                      self.otherSubject];
+}
+
+- (NSString *)description
+{
+  return [NSString stringWithFormat:@"be identical to %@", self.otherSubject];
+}
+
+#pragma mark -
+#pragma mark Configuring Matchers
+
+- (void)beIdenticalTo:(id)anObject {
+    self.otherSubject = anObject;
+}
+
+@end
Pods/Kiwi/Classes/KWBeKindOfClassMatcher.h
@@ -0,0 +1,20 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+#import "KWMatcher.h"
+
+@interface KWBeKindOfClassMatcher : KWMatcher {
+@private
+    Class targetClass;
+}
+
+#pragma mark -
+#pragma mark Configuring Matchers
+
+- (void)beKindOfClass:(Class)aClass;
+
+@end
Pods/Kiwi/Classes/KWBeKindOfClassMatcher.m
@@ -0,0 +1,60 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWBeKindOfClassMatcher.h"
+#import "KWFormatter.h"
+
+@interface KWBeKindOfClassMatcher()
+
+#pragma mark -
+#pragma mark Properties
+
+@property (nonatomic, readwrite, assign) Class targetClass;
+
+@end
+
+@implementation KWBeKindOfClassMatcher
+
+#pragma mark -
+#pragma mark Properties
+
+@synthesize targetClass;
+
+#pragma mark -
+#pragma mark Getting Matcher Strings
+
++ (NSArray *)matcherStrings {
+    return @[@"beKindOfClass:"];
+}
+
+#pragma mark -
+#pragma mark Matching
+
+- (BOOL)evaluate {
+    return [self.subject isKindOfClass:self.targetClass];
+}
+
+#pragma mark -
+#pragma mark Getting Failure Messages
+
+- (NSString *)failureMessageForShould {
+    return [NSString stringWithFormat:@"expected subject to be kind of %@",
+                                      NSStringFromClass(self.targetClass)];
+}
+
+- (NSString *)description
+{
+  return [NSString stringWithFormat:@"be kind of %@", NSStringFromClass(self.targetClass)];
+}
+
+#pragma mark -
+#pragma mark Configuring Matchers
+
+- (void)beKindOfClass:(Class)aClass {
+    self.targetClass = aClass;
+}
+
+@end
Pods/Kiwi/Classes/KWBeMemberOfClassMatcher.h
@@ -0,0 +1,20 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+#import "KWMatcher.h"
+
+@interface KWBeMemberOfClassMatcher : KWMatcher {
+@private
+    Class targetClass;
+}
+
+#pragma mark -
+#pragma mark Configuring Matchers
+
+- (void)beMemberOfClass:(Class)aClass;
+
+@end
Pods/Kiwi/Classes/KWBeMemberOfClassMatcher.m
@@ -0,0 +1,61 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWBeMemberOfClassMatcher.h"
+#import "KWFormatter.h"
+
+@interface KWBeMemberOfClassMatcher()
+
+#pragma mark -
+#pragma mark Properties
+
+@property (nonatomic, readwrite, assign) Class targetClass;
+
+@end
+
+@implementation KWBeMemberOfClassMatcher
+
+#pragma mark -
+#pragma mark Properties
+
+@synthesize targetClass;
+
+#pragma mark -
+#pragma mark Getting Matcher Strings
+
++ (NSArray *)matcherStrings {
+    return @[@"beMemberOfClass:"];
+}
+
+#pragma mark -
+#pragma mark Matching
+
+- (BOOL)evaluate {
+    return [self.subject isMemberOfClass:self.targetClass];
+}
+
+#pragma mark -
+#pragma mark Getting Failure Messages
+
+- (NSString *)failureMessageForShould {
+    return [NSString stringWithFormat:@"expected subject to be member of %@",
+                                      NSStringFromClass(self.targetClass)];
+}
+
+- (NSString *)description
+{
+  return [NSString stringWithFormat:@"be member of %@",
+                                    NSStringFromClass(self.targetClass)];
+}
+
+#pragma mark -
+#pragma mark Configuring Matchers
+
+- (void)beMemberOfClass:(Class)aClass {
+    self.targetClass = aClass;
+}
+
+@end
Pods/Kiwi/Classes/KWBeNilMatcher.h
@@ -0,0 +1,16 @@
+//
+//  KWBeNilMatcher.h
+//  iOSFalconCore
+//
+//  Created by Luke Redpath on 14/01/2011.
+//  Copyright 2011 LJR Software Limited. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+#import "KWMatcher.h"
+
+@interface KWBeNilMatcher : KWMatcher {
+
+}
+- (void)beNil;
+@end
Pods/Kiwi/Classes/KWBeNilMatcher.m
@@ -0,0 +1,48 @@
+//
+//  KWBeNilMatcher.m
+//  iOSFalconCore
+//
+//  Created by Luke Redpath on 14/01/2011.
+//  Copyright 2011 LJR Software Limited. All rights reserved.
+//
+
+#import "KWBeNilMatcher.h"
+#import "KWFormatter.h"
+
+@implementation KWBeNilMatcher
+
+#pragma mark -
+#pragma mark Getting Matcher Strings
+
++ (NSArray *)matcherStrings {
+  return @[@"beNil"];
+}
+
+#pragma mark -
+#pragma mark Matching
+
+- (BOOL)evaluate {
+  return (BOOL)(self.subject == nil);
+}
+
+#pragma mark -
+#pragma mark Getting Failure Messages
+
+- (NSString *)failureMessageForShould {
+  return [NSString stringWithFormat:@"expected subject to be nil, got %@",
+          [KWFormatter formatObject:self.subject]];
+}
+
+- (NSString *)failureMessageForShouldNot {
+  return [NSString stringWithFormat:@"expected %@ not to be nil",
+          [KWFormatter formatObject:self.subject]];
+}
+
+- (void)beNil {}
+
+- (NSString *)description
+{
+  return @"be nil";
+}
+
+@end
Pods/Kiwi/Classes/KWBeNonNilMatcher.h
@@ -0,0 +1,16 @@
+//
+//  KWBeNotNilMatcher.h
+//  Kiwi
+//
+//  Created by Luke Redpath on 17/01/2011.
+//  Copyright 2011 Allen Ding. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+#import "KWMatcher.h"
+
+@interface KWBeNonNilMatcher : KWMatcher {
+
+}
+- (void)beNonNil;
+@end
Pods/Kiwi/Classes/KWBeNonNilMatcher.m
@@ -0,0 +1,48 @@
+//
+//  KWBeNotNilMatcher.m
+//  Kiwi
+//
+//  Created by Luke Redpath on 17/01/2011.
+//  Copyright 2011 Allen Ding. All rights reserved.
+//
+
+#import "KWBeNonNilMatcher.h"
+#import "KWFormatter.h"
+
+@implementation KWBeNonNilMatcher
+
+#pragma mark -
+#pragma mark Getting Matcher Strings
+
++ (NSArray *)matcherStrings {
+  return @[@"beNonNil"];
+}
+
+#pragma mark -
+#pragma mark Matching
+
+- (BOOL)evaluate {
+  return (BOOL)(self.subject != nil);
+}
+
+#pragma mark -
+#pragma mark Getting Failure Messages
+
+- (NSString *)failureMessageForShould {
+  return [NSString stringWithFormat:@"expected subject to be non-nil, got %@",
+          [KWFormatter formatObject:self.subject]];
+}
+
+- (NSString *)failureMessageForShouldNot {
+  return [NSString stringWithFormat:@"expected %@ not to be non-nil",
+          [KWFormatter formatObject:self.subject]];
+}
+
+- (NSString *)description
+{
+  return @"be non-nil";
+}
+
+- (void)beNonNil {}
+
+@end
Pods/Kiwi/Classes/KWBeSubclassOfClassMatcher.h
@@ -0,0 +1,20 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+#import "KWMatcher.h"
+
+@interface KWBeSubclassOfClassMatcher : KWMatcher {
+@private
+    Class targetClass;
+}
+
+#pragma mark -
+#pragma mark Configuring Matchers
+
+- (void)beSubclassOfClass:(Class)aClass;
+
+@end
Pods/Kiwi/Classes/KWBeSubclassOfClassMatcher.m
@@ -0,0 +1,61 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWBeSubclassOfClassMatcher.h"
+#import "KWFormatter.h"
+
+@interface KWBeSubclassOfClassMatcher()
+
+#pragma mark -
+#pragma mark Properties
+
+@property (nonatomic, readwrite, assign) Class targetClass;
+
+@end
+
+@implementation KWBeSubclassOfClassMatcher
+
+#pragma mark -
+#pragma mark Properties
+
+@synthesize targetClass;
+
+#pragma mark -
+#pragma mark Getting Matcher Strings
+
++ (NSArray *)matcherStrings {
+    return @[@"beSubclassOfClass:"];
+}
+
+#pragma mark -
+#pragma mark Matching
+
+- (BOOL)evaluate {
+    return [self.subject isSubclassOfClass:self.targetClass];
+}
+
+#pragma mark -
+#pragma mark Getting Failure Messages
+
+- (NSString *)failureMessageForShould {
+    return [NSString stringWithFormat:@"expected subject to be subclass of %@",
+                                      NSStringFromClass(self.targetClass)];
+}
+
+- (NSString *)description
+{
+    return [NSString stringWithFormat:@"be member of %@",
+                                      NSStringFromClass(self.targetClass)];
+}
+
+#pragma mark -
+#pragma mark Configuring Matchers
+
+- (void)beSubclassOfClass:(Class)aClass {
+    self.targetClass = aClass;
+}
+
+@end
Pods/Kiwi/Classes/KWBeTrueMatcher.h
@@ -0,0 +1,23 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+#import "KWMatcher.h"
+
+@interface KWBeTrueMatcher : KWMatcher {
+@private
+    BOOL expectedValue;
+}
+
+#pragma mark -
+#pragma mark Configuring Matchers
+
+- (void)beTrue;
+- (void)beFalse;
+- (void)beYes;
+- (void)beNo;
+
+@end
Pods/Kiwi/Classes/KWBeTrueMatcher.m
@@ -0,0 +1,77 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWBeTrueMatcher.h"
+
+@interface KWBeTrueMatcher()
+
+#pragma mark -
+#pragma mark Properties
+
+@property (nonatomic, readwrite) BOOL expectedValue;
+
+@end
+
+@implementation KWBeTrueMatcher
+
+#pragma mark -
+#pragma mark Properties
+
+@synthesize expectedValue;
+
+#pragma mark -
+#pragma mark Getting Matcher Strings
+
++ (NSArray *)matcherStrings {
+    return @[@"beTrue", @"beFalse", @"beYes", @"beNo"];
+}
+
+#pragma mark -
+#pragma mark Matching
+
+- (BOOL)evaluate {
+    if (![self.subject respondsToSelector:@selector(boolValue)])
+        [NSException raise:@"KWMatcherException" format:@"subject does not respond to -boolValue"];
+
+    return [self.subject boolValue] == self.expectedValue;
+}
+
+#pragma mark -
+#pragma mark Getting Failure Messages
+
+- (NSString *)failureMessageForShould {
+    return [NSString stringWithFormat:@"expected subject to be %@",
+                                       expectedValue ? @"true" : @"false"];
+}
+
+- (NSString *)description
+{
+  if (self.expectedValue == YES) {
+    return @"be true";
+  }
+  return @"be false";
+}
+
+#pragma mark -
+#pragma mark Configuring Matchers
+
+- (void)beTrue {
+    self.expectedValue = YES;
+}
+
+- (void)beFalse {
+    self.expectedValue = NO;
+}
+
+- (void)beYes {
+    self.expectedValue = YES;
+}
+
+- (void)beNo {
+    self.expectedValue = NO;
+}
+
+@end
Pods/Kiwi/Classes/KWBeWithinMatcher.h
@@ -0,0 +1,22 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+#import "KWMatcher.h"
+
+@interface KWBeWithinMatcher : KWMatcher {
+@private
+    id distance;
+    id otherValue;
+}
+
+#pragma mark -
+#pragma mark Configuring Matchers
+
+- (void)beWithin:(id)aDistance of:(id)aValue;
+- (void)equal:(double)aValue withDelta:(double)aDelta;
+
+@end
Pods/Kiwi/Classes/KWBeWithinMatcher.m
@@ -0,0 +1,114 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWBeWithinMatcher.h"
+#import "KWFormatter.h"
+#import "KWObjCUtilities.h"
+#import "KWValue.h"
+
+@interface KWBeWithinMatcher()
+
+#pragma mark -
+#pragma mark Properties
+
+@property (nonatomic, readwrite, retain) id distance;
+@property (nonatomic, readwrite, retain) id otherValue;
+
+@end
+
+@implementation KWBeWithinMatcher
+
+#pragma mark -
+#pragma mark Initializing
+
+- (void)dealloc {
+    [distance release];
+    [otherValue release];
+    [super dealloc];
+}
+
+#pragma mark -
+#pragma mark Properties
+
+@synthesize distance;
+@synthesize otherValue;
+
+#pragma mark -
+#pragma mark Getting Matcher Strings
+
++ (NSArray *)matcherStrings {
+    return @[@"beWithin:of:", @"equal:withDelta:"];
+}
+
+#pragma mark -
+#pragma mark Matching
+
+// Evaluation is done by getting the underlying values as the widest data
+// types available.
+
+- (BOOL)evaluateForFloatingPoint {
+    double firstValue = [self.subject doubleValue];
+    double secondValue = [self.otherValue doubleValue];
+    double theDistance = [self.distance doubleValue];
+    double absoluteDifference = firstValue > secondValue ? firstValue - secondValue : secondValue - firstValue;
+    return absoluteDifference <= theDistance;
+}
+
+- (BOOL)evaluateForUnsignedIntegral {
+    unsigned long long firstValue = [self.subject unsignedLongLongValue];
+    unsigned long long secondValue = [self.otherValue unsignedLongLongValue];
+    unsigned long long theDistance = [self.distance unsignedLongLongValue];
+    unsigned long long absoluteDifference = firstValue > secondValue ? firstValue - secondValue : secondValue - firstValue;
+    return absoluteDifference <= theDistance;
+}
+
+- (BOOL)evaluateForSignedIntegral {
+    long long firstValue = [self.subject longLongValue];
+    long long secondValue = [self.otherValue longLongValue];
+    long long theDistance = [self.distance longLongValue];
+    long long absoluteDifference = firstValue > secondValue ? firstValue - secondValue : secondValue - firstValue;
+    return absoluteDifference <= theDistance;
+}
+
+- (BOOL)evaluate {
+    const char *objCType = [self.subject objCType];
+
+    if (KWObjCTypeIsFloatingPoint(objCType))
+        return [self evaluateForFloatingPoint];
+    else if (KWObjCTypeIsUnsignedIntegral(objCType))
+        return [self evaluateForUnsignedIntegral];
+    else
+        return [self evaluateForSignedIntegral];
+}
+
+#pragma mark -
+#pragma mark Getting Failure Messages
+
+- (NSString *)failureMessageForShould {
+    return [NSString stringWithFormat:@"expected subject to be within %@ of %@, got %@",
+                                      [KWFormatter formatObject:self.distance],
+                                      [KWFormatter formatObject:self.otherValue],
+                                      [KWFormatter formatObject:self.subject]];
+}
+
+- (NSString *)description
+{
+  return [NSString stringWithFormat:@"be within %@ of %@", self.distance, self.otherValue];
+}
+
+#pragma mark -
+#pragma mark Configuring Matchers
+
+- (void)beWithin:(id)aDistance of:(id)aValue {
+    self.distance = aDistance;
+    self.otherValue = aValue;
+}
+
+- (void)equal:(double)aValue withDelta:(double)aDelta {
+    [self beWithin:[KWValue valueWithDouble:aDelta] of:[KWValue valueWithDouble:aValue]];
+}
+
+@end
Pods/Kiwi/Classes/KWBeZeroMatcher.h
@@ -0,0 +1,17 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+#import "KWMatcher.h"
+
+@interface KWBeZeroMatcher : KWMatcher
+
+#pragma mark -
+#pragma mark Configuring Matchers
+
+- (void)beZero;
+
+@end
Pods/Kiwi/Classes/KWBeZeroMatcher.m
@@ -0,0 +1,48 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWBeZeroMatcher.h"
+#import "KWFormatter.h"
+#import "KWValue.h"
+
+@implementation KWBeZeroMatcher
+
+#pragma mark -
+#pragma mark Getting Matcher Strings
+
++ (NSArray *)matcherStrings {
+    return @[@"beZero"];
+}
+
+#pragma mark -
+#pragma mark Matching
+
+- (BOOL)evaluate {
+    if (![self.subject respondsToSelector:@selector(boolValue)])
+        [NSException raise:@"KWMatcherException" format:@"subject does not respond to -numberValue"];
+
+    return [[self.subject numberValue] isEqualToNumber:@0];
+}
+
+#pragma mark -
+#pragma mark Getting Failure Messages
+
+- (NSString *)failureMessageForShould {
+    return [NSString stringWithFormat:@"expected subject to be zero, got %@",
+                                      [KWFormatter formatObject:self.subject]];
+}
+
+- (NSString *)failureMessageForShouldNot {
+    return [NSString stringWithFormat:@"expected subject not to be zero"];
+}
+
+#pragma mark -
+#pragma mark Configuring Matchers
+
+- (void)beZero {
+}
+
+@end
Pods/Kiwi/Classes/KWBlock.h
@@ -0,0 +1,33 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+
+typedef void (^KWVoidBlock)(void);
+
+@interface KWBlock : NSObject {
+@private
+    KWVoidBlock block;
+}
+
+#pragma mark -
+#pragma mark Initializing
+- (id)initWithBlock:(KWVoidBlock)aBlock;
+
++ (id)blockWithBlock:(KWVoidBlock)aBlock;
+
+#pragma mark -
+#pragma mark Calling Blocks
+
+- (void)call;
+
+@end
+
+#pragma mark -
+#pragma mark Creating Blocks
+
+KWBlock *theBlock(KWVoidBlock aBlock);
+KWBlock *lambda(KWVoidBlock aBlock);
Pods/Kiwi/Classes/KWBlock.m
@@ -0,0 +1,63 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWBlock.h"
+
+@interface KWBlock()
+
+#pragma mark -
+#pragma mark Properties
+
+@property (nonatomic, readonly, assign) KWVoidBlock block;
+
+@end
+
+@implementation KWBlock
+
+#pragma mark -
+#pragma mark Initializing
+
+- (id)initWithBlock:(KWVoidBlock)aBlock {
+    if ((self = [super init])) {
+        block = Block_copy(aBlock);
+    }
+
+    return self;
+}
+
++ (id)blockWithBlock:(KWVoidBlock)aBlock {
+    return [[[self alloc] initWithBlock:aBlock] autorelease];
+}
+
+- (void)dealloc {
+    Block_release(block);
+    [super dealloc];
+}
+
+#pragma mark -
+#pragma mark Properties
+
+@synthesize block;
+
+#pragma mark -
+#pragma mark Calling Blocks
+
+- (void)call {
+    block();
+}
+
+@end
+
+#pragma mark -
+#pragma mark Creating Blocks
+
+KWBlock *theBlock(KWVoidBlock aBlock) {
+    return lambda(aBlock);
+}
+
+KWBlock *lambda(KWVoidBlock aBlock) {
+    return [KWBlock blockWithBlock:aBlock];
+}
Pods/Kiwi/Classes/KWBlockNode.h
@@ -0,0 +1,44 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+#import "KWBlock.h"
+
+@class KWCallSite;
+
+@interface KWBlockNode : NSObject {
+@private
+    KWCallSite *callSite;
+    NSString *description;
+    KWVoidBlock block;
+}
+
+#pragma mark -
+#pragma mark Initializing
+
+- (id)initWithCallSite:(KWCallSite *)aCallSite description:(NSString *)aDescription block:(KWVoidBlock)aBlock;
+
+#pragma mark -
+#pragma mark Getting Call Sites
+
+@property (nonatomic, readonly) KWCallSite *callSite;
+
+#pragma mark -
+#pragma mark Getting Descriptions
+
+@property (nonatomic, copy) NSString *description;
+
+#pragma mark -
+#pragma mark Getting Blocks
+
+@property (nonatomic, readonly) KWVoidBlock block;
+
+#pragma mark -
+#pragma mark Performing blocks
+
+- (void)performBlock;
+
+@end
Pods/Kiwi/Classes/KWBlockNode.m
@@ -0,0 +1,53 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWBlockNode.h"
+
+@implementation KWBlockNode
+
+@synthesize description = _description;
+
+#pragma mark -
+#pragma mark Initializing
+
+- (id)initWithCallSite:(KWCallSite *)aCallSite description:(NSString *)aDescription block:(KWVoidBlock)aBlock{
+    if ((self = [super init])) {
+        callSite = [aCallSite retain];
+        _description = [aDescription copy];
+
+        if (aBlock != nil)
+            block = Block_copy(aBlock);
+    }
+
+    return self;
+}
+
+- (void)dealloc {
+    [callSite release];
+    [description release];
+
+    if (block != nil)
+        Block_release(block);
+
+    [super dealloc];
+}
+
+- (void)performBlock
+{
+  if (block != nil) { block(); }
+}
+
+#pragma mark -
+#pragma mark Getting Call Sites
+
+@synthesize callSite;
+
+#pragma mark -
+#pragma mark Accepting Visitors
+
+@synthesize block;
+
+@end
Pods/Kiwi/Classes/KWBlockRaiseMatcher.h
@@ -0,0 +1,24 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+#import "KWMatcher.h"
+
+@interface KWBlockRaiseMatcher : KWMatcher {
+@private
+    NSException *exception;
+    NSException *actualException;
+}
+
+#pragma mark -
+#pragma mark Configuring Matchers
+
+- (void)raise;
+- (void)raiseWithName:(NSString *)aName;
+- (void)raiseWithReason:(NSString *)aReason;
+- (void)raiseWithName:(NSString *)aName reason:(NSString *)aReason;
+
+@end
Pods/Kiwi/Classes/KWBlockRaiseMatcher.m
@@ -0,0 +1,126 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWBlockRaiseMatcher.h"
+#import "KWBlock.h"
+
+@interface KWBlockRaiseMatcher()
+
+#pragma mark -
+#pragma mark Properties
+
+@property (nonatomic, readwrite, retain) NSException *exception;
+@property (nonatomic, readwrite, retain) NSException *actualException;
+
+@end
+
+@implementation KWBlockRaiseMatcher
+
+#pragma mark -
+#pragma mark Initializing
+
+- (void)dealloc {
+    [exception release];
+    [actualException release];
+    [super dealloc];
+}
+
+#pragma mark -
+#pragma mark Properties
+
+@synthesize exception;
+@synthesize actualException;
+
+#pragma mark -
+#pragma mark Getting Matcher Strings
+
++ (NSArray *)matcherStrings {
+    return @[@"raise",
+                                     @"raiseWithName:",
+                                     @"raiseWithReason:",
+                                     @"raiseWithName:reason:"];
+}
+
+#pragma mark -
+#pragma mark Matching
+
+- (BOOL)evaluate {
+    if (![self.subject isKindOfClass:[KWBlock class]])
+        [NSException raise:@"KWMatcherException" format:@"subject must be a KWBlock"];
+
+    @try {
+        [self.subject call];
+    } @catch (NSException *anException) {
+        self.actualException = anException;
+
+        if ([self.exception name] != nil && ![[self.exception name] isEqualToString:[anException name]])
+            return NO;
+
+        if ([self.exception reason] != nil && ![[self.exception reason] isEqualToString:[anException reason]])
+            return NO;
+
+        return YES;
+    }
+
+    return NO;
+}
+
+#pragma mark -
+#pragma mark Getting Failure Messages
+
++ (NSString *)exceptionPhraseWithException:(NSException *)anException {
+    if (anException == nil)
+        return @"nothing";
+
+    NSString *namePhrase = nil;
+
+    if ([anException name] == nil)
+        namePhrase = @"exception";
+    else
+        namePhrase = [anException name];
+
+    if ([anException reason] == nil)
+        return namePhrase;
+
+    return [NSString stringWithFormat:@"%@ \"%@\"", namePhrase, [anException reason]];
+}
+
+- (NSString *)failureMessageForShould {
+    return [NSString stringWithFormat:@"expected %@, but %@ raised",
+                                      [[self class] exceptionPhraseWithException:self.exception],
+                                      [[self class] exceptionPhraseWithException:self.actualException]];
+}
+
+- (NSString *)failureMessageForShouldNot {
+    return [NSString stringWithFormat:@"expected %@ not to be raised",
+                                      [[self class] exceptionPhraseWithException:self.actualException]];
+}
+
+#pragma mark -
+#pragma mark Configuring Matchers
+
+- (void)raise {
+    [self raiseWithName:nil reason:nil];
+}
+
+- (void)raiseWithName:(NSString *)aName {
+    [self raiseWithName:aName reason:nil];
+}
+
+- (void)raiseWithReason:(NSString *)aReason {
+    [self raiseWithName:nil reason:aReason];
+}
+
+- (void)raiseWithName:(NSString *)aName reason:(NSString *)aReason {
+    self.exception = [NSException exceptionWithName:aName reason:aReason userInfo:nil];
+}
+
+- (NSString *)description
+{
+  return [NSString stringWithFormat:@"raise %@", [[self class] exceptionPhraseWithException:self.exception]];
+}
+
+@end
Pods/Kiwi/Classes/KWCallSite.h
@@ -0,0 +1,33 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+
+@interface KWCallSite : NSObject {
+@private
+    NSString *filename;
+    NSUInteger lineNumber;
+}
+
+#pragma mark -
+#pragma mark Initializing
+
+- (id)initWithFilename:(NSString *)aFilename lineNumber:(NSUInteger)aLineNumber;
+
++ (id)callSiteWithFilename:(NSString *)aFilename lineNumber:(NSUInteger)aLineNumber;
+
+#pragma mark -
+#pragma mark Properties
+
+@property (nonatomic, readonly, copy) NSString *filename;
+@property (nonatomic, readonly) NSUInteger lineNumber;
+
+#pragma mark -
+#pragma mark Identifying and Comparing
+
+- (BOOL)isEqualToCallSite:(KWCallSite *)aCallSite;
+
+@end
Pods/Kiwi/Classes/KWCallSite.m
@@ -0,0 +1,56 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWCallSite.h"
+
+@implementation KWCallSite
+
+#pragma mark -
+#pragma mark Initializing
+
+- (id)initWithFilename:(NSString *)aFilename lineNumber:(NSUInteger)aLineNumber {
+    if ((self = [super init])) {
+        filename = [aFilename copy];
+        lineNumber = aLineNumber;
+    }
+
+    return self;
+}
+
++ (id)callSiteWithFilename:(NSString *)aFilename lineNumber:(NSUInteger)aLineNumber {
+    return [[[self alloc] initWithFilename:aFilename lineNumber:aLineNumber] autorelease];
+}
+
+- (void)dealloc {
+    [filename release];
+    [super dealloc];
+}
+
+#pragma mark -
+#pragma mark Accessing Call Site Properties
+
+@synthesize filename;
+@synthesize lineNumber;
+
+#pragma mark -
+#pragma mark Identifying and Comparing
+
+- (NSUInteger)hash {
+    return [[NSString stringWithFormat:@"%@%u", self.filename, (unsigned)self.lineNumber] hash];
+}
+
+- (BOOL)isEqual:(id)anObject {
+    if (![anObject isKindOfClass:[KWCallSite class]])
+        return NO;
+
+    return [self isEqualToCallSite:anObject];
+}
+
+- (BOOL)isEqualToCallSite:(KWCallSite *)aCallSite {
+    return [self.filename isEqualToString:aCallSite.filename] && (self.lineNumber == aCallSite.lineNumber);
+}
+
+@end
Pods/Kiwi/Classes/KWCaptureSpy.h
@@ -0,0 +1,14 @@
+#import <Foundation/Foundation.h>
+#import "KWMock.h"
+#import "KWMessageSpying.h"
+
+@interface KWCaptureSpy : NSObject<KWMessageSpying> {
+    BOOL _argumentCaptured;
+    id _argument;
+    NSUInteger _argumentIndex;
+}
+
+- (id)initWithArgumentIndex:(NSUInteger)index;
+@property(nonatomic, readonly, retain) id argument;
+
+@end
Pods/Kiwi/Classes/KWCaptureSpy.m
@@ -0,0 +1,49 @@
+#import "KWCaptureSpy.h"
+#import "KWObjCUtilities.h"
+#import "NSInvocation+KiwiAdditions.h"
+#import "NSMethodSignature+KiwiAdditions.h"
+#import "KWValue.h"
+
+@implementation KWCaptureSpy
+@dynamic argument;
+
+- (id)initWithArgumentIndex:(NSUInteger)index {
+    if ((self = [super init])) {
+        _argumentIndex = index;
+        _argumentCaptured = NO;
+    }
+    return self;
+}
+
+- (id)argument {
+    if (!_argumentCaptured) {
+        @throw [NSException exceptionWithName:NSInternalInconsistencyException reason:@"Argument requested has yet to be captured." userInfo:nil];
+    }
+    return [[_argument retain] autorelease];
+}
+
+- (void)object:(id)anObject didReceiveInvocation:(NSInvocation *)anInvocation {
+    if (!_argumentCaptured) {
+        NSMethodSignature *signature = [anInvocation methodSignature];
+        const char *objCType = [signature messageArgumentTypeAtIndex:_argumentIndex];
+        if (KWObjCTypeIsObject(objCType)) {
+            id argument = nil;
+            [anInvocation getMessageArgument:&argument atIndex:_argumentIndex];
+            if (KWObjCTypeIsBlock(objCType)) {
+                _argument = [argument copy];
+            } else {
+                _argument = [argument retain];
+            }
+        } else {
+            NSData *data = [anInvocation messageArgumentDataAtIndex:_argumentIndex];
+            _argument = [[KWValue valueWithBytes:[data bytes] objCType:objCType] retain];
+        }
+        _argumentCaptured = YES;
+    }
+}
+
+- (void)dealloc {
+    [_argument release];
+    [super dealloc];
+}
+@end
Pods/Kiwi/Classes/KWChangeMatcher.h
@@ -0,0 +1,21 @@
+//
+//  KWChangeMatcher.h
+//  Kiwi
+//
+//  Copyright (c) 2013 Eloy Durรกn <eloy.de.enige@gmail.com>.
+//  All rights reserved.
+//
+
+#import "KWMatcher.h"
+
+typedef NSInteger (^KWChangeMatcherCountBlock)();
+
+@interface KWChangeMatcher : KWMatcher
+
+// Expect _any_ change.
+- (void)change:(KWChangeMatcherCountBlock)countBlock;
+
+// Expect changes by a specific amount.
+- (void)change:(KWChangeMatcherCountBlock)countBlock by:(NSInteger)expectedDifference;
+
+@end
Pods/Kiwi/Classes/KWChangeMatcher.m
@@ -0,0 +1,84 @@
+//
+//  KWChangeMatcher.m
+//  Kiwi
+//
+//  Copyright (c) 2013 Eloy Durรกn <eloy.de.enige@gmail.com>.
+//  All rights reserved.
+//
+
+#import "KWChangeMatcher.h"
+#import "KWBlock.h"
+
+@interface KWChangeMatcher ()
+@property (nonatomic, copy) KWChangeMatcherCountBlock countBlock;
+@property (nonatomic, assign) BOOL anyChange;
+@property (nonatomic, assign) NSInteger expectedDifference, expectedTotal, actualTotal;
+@end
+
+@implementation KWChangeMatcher
+
+@synthesize countBlock = _countBlock;
+@synthesize anyChange = _anyChange;
+@synthesize expectedDifference = _expectedDifference;
+@synthesize expectedTotal = _expectedTotal;
+@synthesize actualTotal = _actualTotal;
+
+- (void)dealloc {
+    Block_release(_countBlock);
+    [super dealloc];
+}
+
++ (NSArray *)matcherStrings {
+    return @[@"change:by:", @"change:"];
+}
+
+- (NSString *)failureMessageForShould {
+    if (self.anyChange) {
+        return @"expected subject to change the count";
+    } else {
+        return [NSString stringWithFormat:@"expected subject to change the count to %d, got %d", (int)self.expectedTotal, (int)self.actualTotal];
+    }
+}
+
+- (NSString *)failureMessageForShouldNot {
+    if (self.anyChange) {
+        return @"expected subject to not change the count";
+    } else {
+        return [NSString stringWithFormat:@"expected subject not to change the count to %d", (int)self.actualTotal];
+    }
+}
+
+- (NSString *)description {
+    if (self.anyChange) {
+        return @"change count";
+    } else {
+        return [NSString stringWithFormat:@"change count by %d", (int)self.expectedDifference];
+    }
+}
+
+- (BOOL)evaluate {
+    NSInteger before = self.countBlock();
+    // Perform actual work, which is expected to change the result of countBlock.
+    [self.subject call];
+    self.actualTotal = self.countBlock();
+
+    if (self.anyChange) {
+        return before != self.actualTotal;
+    } else {
+        self.expectedTotal = before + self.expectedDifference;
+        return self.expectedTotal == self.actualTotal;
+    }
+}
+
+- (void)change:(KWChangeMatcherCountBlock)countBlock by:(NSInteger)expectedDifference {
+    self.anyChange = NO;
+    self.expectedDifference = expectedDifference;
+    self.countBlock = countBlock;
+}
+
+- (void)change:(KWChangeMatcherCountBlock)countBlock {
+    self.anyChange = YES;
+    self.countBlock = countBlock;
+}
+
+@end
Pods/Kiwi/Classes/KWConformToProtocolMatcher.h
@@ -0,0 +1,20 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+#import "KWMatcher.h"
+
+@interface KWConformToProtocolMatcher : KWMatcher {
+@private
+    Protocol *protocol;
+}
+
+#pragma mark -
+#pragma mark Configuring Matchers
+
+- (void)conformToProtocol:(Protocol *)aProtocol;
+
+@end
Pods/Kiwi/Classes/KWConformToProtocolMatcher.m
@@ -0,0 +1,60 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWConformToProtocolMatcher.h"
+#import "KWFormatter.h"
+
+@interface KWConformToProtocolMatcher()
+
+#pragma mark -
+#pragma mark Properties
+
+@property (nonatomic, readwrite, assign) Protocol *protocol;
+
+@end
+
+@implementation KWConformToProtocolMatcher
+
+#pragma mark -
+#pragma mark Properties
+
+@synthesize protocol;
+
+#pragma mark -
+#pragma mark Getting Matcher Strings
+
++ (NSArray *)matcherStrings {
+    return @[@"conformToProtocol:"];
+}
+
+#pragma mark -
+#pragma mark Matching
+
+- (BOOL)evaluate {
+    return [self.subject conformsToProtocol:self.protocol];
+}
+
+#pragma mark -
+#pragma mark Getting Failure Messages
+
+- (NSString *)failureMessageForShould {
+    return [NSString stringWithFormat:@"expected subject to conform to %@ protocol",
+                                      NSStringFromProtocol(self.protocol)];
+}
+
+- (NSString *)description
+{
+  return [NSString stringWithFormat:@"conform to %@ protocol", NSStringFromProtocol(self.protocol)];
+}
+
+#pragma mark -
+#pragma mark Configuring Matchers
+
+- (void)conformToProtocol:(Protocol *)aProtocol {
+    self.protocol = aProtocol;
+}
+
+@end
Pods/Kiwi/Classes/KWContainMatcher.h
@@ -0,0 +1,31 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+#import "KWMatcher.h"
+#import "KWMatchVerifier.h"
+
+@interface KWContainMatcher : KWMatcher {
+@private
+    NSArray *objects;
+}
+
+#pragma mark -
+#pragma mark Configuring Matchers
+
+- (void)contain:(id)anObject;
+- (void)containObjectsInArray:(NSArray *)anArray;
+
+@end
+
+@interface KWMatchVerifier(KWContainMatcherAdditions)
+
+#pragma mark -
+#pragma mark Verifying
+
+- (void)containObjects:(id)firstObject, ... NS_REQUIRES_NIL_TERMINATION;
+
+@end
Pods/Kiwi/Classes/KWContainMatcher.m
@@ -0,0 +1,110 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWContainMatcher.h"
+#import "KWFormatter.h"
+#import "KWGenericMatchingAdditions.h"
+
+@interface KWContainMatcher()
+
+#pragma mark -
+#pragma mark Properties
+
+@property (nonatomic, readwrite, retain) id objects;
+
+@end
+
+@implementation KWContainMatcher
+
+#pragma mark -
+#pragma mark Initializing
+
+- (void)dealloc {
+    [objects release];
+    [super dealloc];
+}
+
+#pragma mark -
+#pragma mark Properties
+
+@synthesize objects;
+
+#pragma mark -
+#pragma mark Getting Matcher Strings
+
++ (NSArray *)matcherStrings {
+    return @[@"contain:", @"containObjectsInArray:"];
+}
+
+#pragma mark -
+#pragma mark Matching
+
+- (BOOL)evaluate {
+    if (![self.subject respondsToSelector:@selector(containsObjectEqualToOrMatching:)])
+        [NSException raise:@"KWMatcherException" format:@"subject does not respond to -containsObjectEqualToOrMatching:"];
+
+    for (id object in self.objects) {
+        if (![self.subject containsObjectEqualToOrMatching:object])
+          return NO;
+    }
+
+    return YES;
+}
+
+#pragma mark -
+#pragma mark Getting Failure Messages
+
+- (NSString *)objectsPhrase {
+    if ([self.objects count] == 1)
+        return [KWFormatter formatObject:(self.objects)[0]];
+
+    return [NSString stringWithFormat:@"all of %@", [KWFormatter formatObject:self.objects]];
+}
+
+- (NSString *)failureMessageForShould {
+    return [NSString stringWithFormat:@"expected subject to contain %@", [self objectsPhrase]];
+}
+
+- (NSString *)description
+{
+  return [NSString stringWithFormat:@"contain %@", [self objectsPhrase]];
+}
+
+#pragma mark -
+#pragma mark Configuring Matchers
+
+- (void)contain:(id)anObject {
+    self.objects = @[anObject];
+}
+
+- (void)containObjectsInArray:(NSArray *)anArray {
+    self.objects = anArray;
+}
+
+@end
+
+@implementation KWMatchVerifier(KWContainMatcherAdditions)
+
+#pragma mark -
+#pragma mark Verifying
+
+- (void)containObjects:(id)firstObject, ... {
+    NSMutableArray *objects = [NSMutableArray array];
+
+    va_list argumentList;
+    va_start(argumentList, firstObject);
+    id object = firstObject;
+
+    while (object != nil) {
+        [objects addObject:object];
+        object = va_arg(argumentList, id);
+    }
+
+    va_end(argumentList);
+    [(id)self containObjectsInArray:objects];
+}
+
+@end
Pods/Kiwi/Classes/KWContextNode.h
@@ -0,0 +1,73 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+#import "KWExampleNode.h"
+
+@class KWAfterAllNode;
+@class KWAfterEachNode;
+@class KWBeforeAllNode;
+@class KWBeforeEachNode;
+@class KWCallSite;
+@class KWItNode;
+@class KWPendingNode;
+@class KWRegisterMatchersNode;
+@class KWExample;
+
+@interface KWContextNode : NSObject<KWExampleNode> {
+@private
+    KWContextNode *parentContext;
+    KWCallSite *callSite;
+    NSString *description;
+    KWRegisterMatchersNode *registerMatchersNode;
+    KWBeforeAllNode *beforeAllNode;
+    KWAfterAllNode *afterAllNode;
+    KWBeforeEachNode *beforeEachNode;
+    KWAfterEachNode *afterEachNode;
+    NSMutableArray *nodes;
+    BOOL performedExampleCount;
+}
+
+#pragma mark -
+#pragma mark Initializing
+
+- (id)initWithCallSite:(KWCallSite *)aCallSite parentContext:(KWContextNode *)node description:(NSString *)aDescription;
+
++ (id)contextNodeWithCallSite:(KWCallSite *)aCallSite parentContext:(KWContextNode *)contextNode description:(NSString *)aDescription;
+
+#pragma mark -
+#pragma mark  Getting Call Sites
+
+@property (nonatomic, readonly) KWCallSite *callSite;
+
+#pragma mark -
+#pragma mark Getting Descriptions
+
+@property (nonatomic, readonly) NSString *description;
+
+#pragma mark -
+#pragma mark Managing Nodes
+
+@property (nonatomic, readwrite, retain) KWRegisterMatchersNode *registerMatchersNode;
+@property (nonatomic, readwrite, retain) KWBeforeAllNode *beforeAllNode;
+@property (nonatomic, readwrite, retain) KWAfterAllNode *afterAllNode;
+@property (nonatomic, readwrite, retain) KWBeforeEachNode *beforeEachNode;
+@property (nonatomic, readwrite, retain) KWAfterEachNode *afterEachNode;
+@property (nonatomic, readonly) KWContextNode *parentContext;
+@property (nonatomic, readonly) NSArray *nodes;
+
+- (void)addContextNode:(KWContextNode *)aNode;
+- (void)addItNode:(KWItNode *)aNode;
+- (void)addPendingNode:(KWPendingNode *)aNode;
+
+- (void)performExample:(KWExample *)example withBlock:(void (^)(void))exampleBlock;
+
+#pragma mark -
+#pragma mark Accepting Visitors
+
+- (void)acceptExampleNodeVisitor:(id<KWExampleNodeVisitor>)aVisitor;
+
+@end
Pods/Kiwi/Classes/KWContextNode.m
@@ -0,0 +1,147 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWContextNode.h"
+#import "KWExampleNodeVisitor.h"
+#import "KWExample.h"
+#import "KWFailure.h"
+
+@implementation KWContextNode
+
+@synthesize parentContext;
+
+#pragma mark -
+#pragma mark Initializing
+
+- (id)initWithCallSite:(KWCallSite *)aCallSite parentContext:(KWContextNode *)node description:(NSString *)aDescription
+{
+    if ((self = [super init])) {
+        parentContext = [node retain];
+        callSite = [aCallSite retain];
+        description = [aDescription copy];
+        nodes = [[NSMutableArray alloc] init];
+        performedExampleCount = 0;
+    }
+
+    return self;
+}
+
++ (id)contextNodeWithCallSite:(KWCallSite *)aCallSite parentContext:(KWContextNode *)contextNode description:(NSString *)aDescription {
+    return [[[self alloc] initWithCallSite:aCallSite parentContext:contextNode description:aDescription] autorelease];
+}
+
+- (void)dealloc {
+    [parentContext release];
+    [callSite release];
+    [description release];
+    [registerMatchersNode release];
+    [beforeAllNode release];
+    [afterAllNode release];
+    [beforeEachNode release];
+    [afterEachNode release];
+    [nodes release];
+    [super dealloc];
+}
+
+#pragma mark -
+#pragma mark  Getting Call Sites
+
+@synthesize callSite;
+
+#pragma mark -
+#pragma mark Getting Descriptions
+
+@synthesize description;
+
+#pragma mark -
+#pragma mark Managing Nodes
+
+@synthesize registerMatchersNode;
+@synthesize beforeAllNode;
+@synthesize afterAllNode;
+@synthesize beforeEachNode;
+@synthesize afterEachNode;
+@synthesize nodes;
+
+- (void)addContextNode:(KWContextNode *)aNode {
+    [(NSMutableArray *)self.nodes addObject:aNode];
+}
+
+- (void)setRegisterMatchersNode:(KWRegisterMatchersNode *)aNode {
+    if (self.registerMatchersNode != nil)
+        [NSException raise:@"KWContextNodeException" format:@"a register matchers node already exists"];
+
+    registerMatchersNode = [aNode retain];
+}
+
+- (void)setBeforeEachNode:(KWBeforeEachNode *)aNode {
+    if (self.beforeEachNode != nil)
+        [NSException raise:@"KWContextNodeException" format:@"a before each node already exists"];
+
+    beforeEachNode = [aNode retain];
+}
+
+- (void)setAfterEachNode:(KWAfterEachNode *)aNode {
+    if (self.afterEachNode != nil)
+        [NSException raise:@"KWContextNodeException" format:@"an after each node already exists"];
+
+    afterEachNode = [aNode retain];
+}
+
+- (void)addItNode:(KWItNode *)aNode {
+    [(NSMutableArray *)self.nodes addObject:aNode];
+}
+
+- (void)addPendingNode:(KWPendingNode *)aNode {
+    [(NSMutableArray *)self.nodes addObject:aNode];
+}
+
+- (void)performExample:(KWExample *)example withBlock:(void (^)(void))exampleBlock
+{
+    void (^innerExampleBlock)(void) = [exampleBlock copy];
+    
+    void (^outerExampleBlock)(void) = ^{
+        @try {
+            [self.registerMatchersNode acceptExampleNodeVisitor:example];
+            
+            if (performedExampleCount == 0) {
+                [self.beforeAllNode acceptExampleNodeVisitor:example];
+            }
+            
+            [self.beforeEachNode acceptExampleNodeVisitor:example];
+            
+            innerExampleBlock();
+            
+            [self.afterEachNode acceptExampleNodeVisitor:example];
+
+            if ([example isLastInContext:self]) {
+                [self.afterAllNode acceptExampleNodeVisitor:example];
+            }
+            
+        } @catch (NSException *exception) {
+            KWFailure *failure = [KWFailure failureWithCallSite:self.callSite format:@"%@ \"%@\" raised", [exception name], [exception reason]];
+            [example reportFailure:failure];
+        }
+        
+        performedExampleCount++;
+    };
+    if (parentContext == nil) {
+        outerExampleBlock();
+    }
+    else {
+        [parentContext performExample:example withBlock:outerExampleBlock];
+    }
+    [innerExampleBlock release];
+}
+
+#pragma mark -
+#pragma mark Accepting Visitors
+
+- (void)acceptExampleNodeVisitor:(id<KWExampleNodeVisitor>)aVisitor {
+    [aVisitor visitContextNode:self];
+}
+
+@end
Pods/Kiwi/Classes/KWCountType.h
@@ -0,0 +1,15 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+
+enum {
+    KWCountTypeExact,
+    KWCountTypeAtLeast,
+    KWCountTypeAtMost
+};
+
+typedef NSUInteger KWCountType;
Pods/Kiwi/Classes/KWDeviceInfo.h
@@ -0,0 +1,17 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+
+@interface KWDeviceInfo : NSObject
+
+#pragma mark -
+#pragma mark Getting the Device Type
+
++ (BOOL)isSimulator;
++ (BOOL)isPhysical;
+
+@end
Pods/Kiwi/Classes/KWDeviceInfo.m
@@ -0,0 +1,32 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWDeviceInfo.h"
+
+#if TARGET_IPHONE_SIMULATOR
+
+#import <UIKit/UIKit.h>
+
+#endif // #if TARGET_IPHONE_SIMULATOR
+
+@implementation KWDeviceInfo
+
+#pragma mark -
+#pragma mark Getting the Device Type
+
++ (BOOL)isSimulator {
+#if TARGET_IPHONE_SIMULATOR
+    return YES;
+#else
+    return NO;
+#endif // #if TARGET_IPHONE_SIMULATOR
+}
+
++ (BOOL)isPhysical {
+    return ![self isSimulator];
+}
+
+@end
Pods/Kiwi/Classes/KWEqualMatcher.h
@@ -0,0 +1,20 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+#import "KWMatcher.h"
+
+@interface KWEqualMatcher : KWMatcher {
+@private
+    id otherSubject;
+}
+
+#pragma mark -
+#pragma mark Configuring Matchers
+
+- (void)equal:(id)anObject;
+
+@end
Pods/Kiwi/Classes/KWEqualMatcher.m
@@ -0,0 +1,79 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWEqualMatcher.h"
+#import "KWFormatter.h"
+#import "KWValue.h"
+
+@interface KWEqualMatcher()
+
+#pragma mark -
+#pragma mark Properties
+
+@property (nonatomic, readwrite, retain) id otherSubject;
+
+@end
+
+@implementation KWEqualMatcher
+
+#pragma mark -
+#pragma mark Initializing
+
+- (void)dealloc {
+    [otherSubject release];
+    [super dealloc];
+}
+
+#pragma mark -
+#pragma mark Properties
+
+@synthesize otherSubject;
+
+#pragma mark -
+#pragma mark Getting Matcher Strings
+
++ (NSArray *)matcherStrings {
+    return @[@"equal:"];
+}
+
+#pragma mark -
+#pragma mark Matching
+
+- (BOOL)evaluate {
+    /** handle this as a special case; KWValue supports NSNumber equality but not vice-versa **/
+    if ([self.subject isKindOfClass:[NSNumber class]] && [self.otherSubject isKindOfClass:[KWValue class]]) {
+        return [self.otherSubject isEqual:self.subject];
+    }
+    return [self.subject isEqual:self.otherSubject];
+}
+
+#pragma mark -
+#pragma mark Getting Failure Messages
+
+- (NSString *)failureMessageForShould {
+    return [NSString stringWithFormat:@"expected subject to equal %@, got %@",
+                                      [KWFormatter formatObject:self.otherSubject],
+                                      [KWFormatter formatObject:self.subject]];
+}
+
+- (NSString *)failureMessageForShouldNot {
+    return [NSString stringWithFormat:@"expected subject not to equal %@",
+                                      [KWFormatter formatObject:self.otherSubject]];
+}
+
+- (NSString *)description
+{
+  return [NSString stringWithFormat:@"equal %@", [KWFormatter formatObject:self.otherSubject]];
+}
+
+#pragma mark -
+#pragma mark Configuring Matchers
+
+- (void)equal:(id)anObject {
+    self.otherSubject = anObject;
+}
+
+@end
Pods/Kiwi/Classes/KWExample.h
@@ -0,0 +1,91 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+#import "KWBlock.h"
+#import "KWVerifying.h"
+#import "KWExpectationType.h"
+#import "KWExampleNode.h"
+#import "KWExampleNodeVisitor.h"
+#import "KWReporting.h"
+#import "KWExampleGroupDelegate.h"
+
+@class KWCallSite;
+@class KWExampleSuite;
+@class KWContextNode;
+@class KWSpec;
+@class KWMatcherFactory;
+
+@interface KWExample : NSObject <KWExampleNodeVisitor, KWReporting> {
+  id<KWExampleNode> exampleNode;
+  BOOL passed;
+}
+@property (nonatomic, retain, readonly) NSMutableArray *lastInContexts;
+@property (nonatomic, assign) KWExampleSuite *suite;
+
+- (id)initWithExampleNode:(id<KWExampleNode>)node;
+
+#pragma mark - Adding Verifiers
+
+- (id)addVerifier:(id<KWVerifying>)aVerifier;
+- (id)addExistVerifierWithExpectationType:(KWExpectationType)anExpectationType callSite:(KWCallSite *)aCallSite;
+- (id)addMatchVerifierWithExpectationType:(KWExpectationType)anExpectationType callSite:(KWCallSite *)aCallSite;
+- (id)addAsyncVerifierWithExpectationType:(KWExpectationType)anExpectationType callSite:(KWCallSite *)aCallSite timeout:(NSInteger)timeout;
+
+#pragma mark - Running
+
+- (void)runWithDelegate:(id<KWExampleDelegate>)delegate;
+
+#pragma mark -
+#pragma mark Anonymous It Node Descriptions
+
+- (NSString *)generateDescriptionForAnonymousItNode;
+
+#pragma mark -
+#pragma mark Checking if last in context
+
+- (BOOL)isLastInContext:(KWContextNode *)context;
+
+#pragma mark -
+#pragma mark Full description with context
+
+- (NSString *)descriptionWithContext;
+
+@end
+
+#pragma mark -
+#pragma mark Building Example Groups
+
+void describe(NSString *aDescription, KWVoidBlock aBlock);
+void context(NSString *aDescription, KWVoidBlock aBlock);
+void registerMatchers(NSString *aNamespacePrefix);
+void beforeAll(KWVoidBlock aBlock);
+void afterAll(KWVoidBlock aBlock);
+void beforeEach(KWVoidBlock aBlock);
+void afterEach(KWVoidBlock aBlock);
+void it(NSString *aDescription, KWVoidBlock aBlock);
+void specify(KWVoidBlock aBlock);
+void pending_(NSString *aDescription, KWVoidBlock ignoredBlock);
+
+void describeWithCallSite(KWCallSite *aCallSite, NSString *aDescription, KWVoidBlock aBlock);
+void contextWithCallSite(KWCallSite *aCallSite, NSString *aDescription, KWVoidBlock aBlock);
+void registerMatchersWithCallSite(KWCallSite *aCallSite, NSString *aNamespacePrefix);
+void beforeAllWithCallSite(KWCallSite *aCallSite, KWVoidBlock aBlock);
+void afterAllWithCallSite(KWCallSite *aCallSite, KWVoidBlock aBlock);
+void beforeEachWithCallSite(KWCallSite *aCallSite, KWVoidBlock aBlock);
+void afterEachWithCallSite(KWCallSite *aCallSite, KWVoidBlock aBlock);
+void itWithCallSite(KWCallSite *aCallSite, NSString *aDescription, KWVoidBlock aBlock);
+void pendingWithCallSite(KWCallSite *aCallSite, NSString *aDescription, KWVoidBlock ignoredBlock);
+
+#define PRAGMA(x) _Pragma (#x)
+#define PENDING(x) PRAGMA(message ( "Pending: " #x ))
+
+#define pending(title, args...) \
+PENDING(title) \
+pending_(title, ## args)
+#define xit(title, args...) \
+PENDING(title) \
+pending_(title, ## args)
Pods/Kiwi/Classes/KWExample.m
@@ -0,0 +1,349 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWExample.h"
+#import "KWExampleGroupBuilder.h"
+#import "KWContextNode.h"
+#import "KWMatcherFactory.h"
+#import "KWExistVerifier.h"
+#import "KWMatchVerifier.h"
+#import "KWAsyncVerifier.h"
+#import "KWFailure.h"
+#import "KWContextNode.h"
+#import "KWBeforeEachNode.h"
+#import "KWBeforeAllNode.h"
+#import "KWItNode.h"
+#import "KWAfterEachNode.h"
+#import "KWAfterAllNode.h"
+#import "KWPendingNode.h"
+#import "KWRegisterMatchersNode.h"
+#import "KWWorkarounds.h"
+#import "KWIntercept.h"
+#import "KWExampleNode.h"
+#import "KWExampleSuite.h"
+
+
+@interface KWExample ()
+
+@property (nonatomic, readonly) NSMutableArray *verifiers;
+@property (nonatomic, readonly) KWMatcherFactory *matcherFactory;
+@property (nonatomic, assign) id<KWExampleDelegate> delegate;
+@property (nonatomic, assign) BOOL didNotFinish;
+
+- (void)reportResultForExampleNodeWithLabel:(NSString *)label;
+
+@end
+
+@implementation KWExample
+
+@synthesize matcherFactory;
+@synthesize verifiers;
+@synthesize delegate = _delegate;
+@synthesize suite;
+@synthesize lastInContexts;
+@synthesize didNotFinish;
+
+- (id)initWithExampleNode:(id<KWExampleNode>)node
+{
+  if ((self = [super init])) {
+    exampleNode = [node retain];
+    matcherFactory = [[KWMatcherFactory alloc] init];
+    verifiers = [[NSMutableArray alloc] init];
+    lastInContexts = [[NSMutableArray alloc] init];
+    passed = YES;
+  }
+  return self;
+}
+
+- (void)dealloc 
+{
+  [lastInContexts release];
+  [exampleNode release];
+  [matcherFactory release];
+  [verifiers release];
+  [super dealloc];
+}
+
+- (BOOL)isLastInContext:(KWContextNode *)context
+{
+  for (KWContextNode *contextWhereItLast in lastInContexts) {
+    if (context == contextWhereItLast) {
+      return YES;
+    }
+  }
+  return NO;
+}
+
+- (NSString *)description
+{
+  return [NSString stringWithFormat:@"<KWExample: %@>", exampleNode.description];
+}
+
+#pragma mark - Adding Verifiers
+
+- (id)addVerifier:(id<KWVerifying>)aVerifier {
+  if (![self.verifiers containsObject:aVerifier])
+    [self.verifiers addObject:aVerifier];
+  
+  return aVerifier;
+}
+
+- (id)addExistVerifierWithExpectationType:(KWExpectationType)anExpectationType callSite:(KWCallSite *)aCallSite {
+  id verifier = [KWExistVerifier existVerifierWithExpectationType:anExpectationType callSite:aCallSite reporter:self];
+  [self addVerifier:verifier];
+  return verifier;
+}
+
+- (id)addMatchVerifierWithExpectationType:(KWExpectationType)anExpectationType callSite:(KWCallSite *)aCallSite {
+  id verifier = [KWMatchVerifier matchVerifierWithExpectationType:anExpectationType callSite:aCallSite matcherFactory:self.matcherFactory reporter:self];
+  [self addVerifier:verifier];
+  return verifier;
+}
+
+- (id)addAsyncVerifierWithExpectationType:(KWExpectationType)anExpectationType callSite:(KWCallSite *)aCallSite timeout:(NSInteger)timeout {
+  id verifier = [KWAsyncVerifier asyncVerifierWithExpectationType:anExpectationType callSite:aCallSite matcherFactory:self.matcherFactory reporter:self probeTimeout:timeout];
+  [self addVerifier:verifier];
+  return verifier;
+}
+
+#pragma mark - Running examples
+
+- (void)runWithDelegate:(id<KWExampleDelegate>)delegate;
+{
+  self.delegate = delegate;
+  [self.matcherFactory registerMatcherClassesWithNamespacePrefix:@"KW"];
+  [[KWExampleGroupBuilder sharedExampleGroupBuilder] setCurrentExample:self];
+  [exampleNode acceptExampleNodeVisitor:self]; 
+}
+
+#pragma mark - Reporting failure
+
+- (NSString *)descriptionForExampleContext {
+  NSMutableArray *parts = [NSMutableArray array];
+
+  for (KWContextNode *context in [[exampleNode contextStack] reverseObjectEnumerator]) {
+    if ([context description] != nil) {
+      [parts addObject:[[context description] stringByAppendingString:@","]];
+    }
+  }
+  
+  return [parts componentsJoinedByString:@" "];
+}
+
+- (KWFailure *)outputReadyFailureWithFailure:(KWFailure *)aFailure {
+  NSString *annotatedFailureMessage = [NSString stringWithFormat:@"'%@ %@' [FAILED], %@",
+                                       [self descriptionForExampleContext], [exampleNode description],
+                                       aFailure.message];
+  
+#if TARGET_IPHONE_SIMULATOR
+  // \uff1a is the unicode for a fill width colon, as opposed to a regular
+  // colon character (':'). This escape is performed so that Xcode doesn't
+  // truncate the error output in the build results window, which is running
+  // build time specs.
+  annotatedFailureMessage = [annotatedFailureMessage stringByReplacingOccurrencesOfString:@":" withString:@"\uff1a"];
+#endif // #if TARGET_IPHONE_SIMULATOR
+  
+  return [KWFailure failureWithCallSite:aFailure.callSite message:annotatedFailureMessage];
+}
+
+- (void)reportFailure:(KWFailure *)failure
+{
+  passed = NO;
+  [self.delegate example:self didFailWithFailure:[self outputReadyFailureWithFailure:failure]];
+}
+
+- (void)reportResultForExampleNodeWithLabel:(NSString *)label
+{
+  NSLog(@"+ '%@ %@' [%@]", [self descriptionForExampleContext], [exampleNode description], label);
+}
+
+#pragma mark - Full description with context
+
+/** Pending cases will be marked yellow by XCode as not finished, because their description differs for -[SenTestCaseRun start] and -[SenTestCaseRun stop] methods
+ */
+
+- (NSString *)pendingNotFinished {
+    BOOL reportPending = self.didNotFinish;
+    self.didNotFinish = YES;
+    return reportPending ? @"(PENDING)" : @"";
+}
+    
+- (NSString *)descriptionWithContext {
+    NSString *descriptionWithContext = [NSString stringWithFormat:@"%@ %@", 
+                                        [self descriptionForExampleContext], 
+                                        [exampleNode description] ? [exampleNode description] : @""];
+    BOOL isPending = [exampleNode isKindOfClass:[KWPendingNode class]];
+    return isPending ? [descriptionWithContext stringByAppendingString:[self pendingNotFinished]] : descriptionWithContext;
+}
+
+#pragma mark - Visiting Nodes
+
+- (void)visitRegisterMatchersNode:(KWRegisterMatchersNode *)aNode {
+  [self.matcherFactory registerMatcherClassesWithNamespacePrefix:aNode.namespacePrefix];
+}
+
+- (void)visitBeforeAllNode:(KWBeforeAllNode *)aNode {
+  if (aNode.block == nil)
+    return;
+  
+  aNode.block();
+}
+
+- (void)visitAfterAllNode:(KWAfterAllNode *)aNode {
+  if (aNode.block == nil)
+    return;
+  
+  aNode.block();
+}
+
+- (void)visitBeforeEachNode:(KWBeforeEachNode *)aNode {
+  if (aNode.block == nil)
+    return;
+  
+  aNode.block();
+}
+
+- (void)visitAfterEachNode:(KWAfterEachNode *)aNode {
+  if (aNode.block == nil)
+    return;
+  
+  aNode.block();
+}
+
+- (void)visitItNode:(KWItNode *)aNode {
+  if (aNode.block == nil || aNode != exampleNode)
+    return;
+  
+  aNode.example = self;
+  
+  [aNode.context performExample:self withBlock:^{
+  
+    @try {      
+      
+      aNode.block();
+      
+#if KW_TARGET_HAS_INVOCATION_EXCEPTION_BUG
+      NSException *invocationException = KWGetAndClearExceptionFromAcrossInvocationBoundary();
+      [invocationException raise];
+#endif // #if KW_TARGET_HAS_INVOCATION_EXCEPTION_BUG
+      
+      // Finish verifying and clear
+      for (id<KWVerifying> verifier in self.verifiers) {
+        [verifier exampleWillEnd];
+      }
+      
+    } @catch (NSException *exception) {
+      KWFailure *failure = [KWFailure failureWithCallSite:aNode.callSite format:@"%@ \"%@\" raised",
+                            [exception name],
+                            [exception reason]];
+      [self reportFailure:failure];
+    }
+    
+    if (passed) {
+      [self reportResultForExampleNodeWithLabel:@"PASSED"];
+    }
+    
+    // Always clear stubs and spies at the end of it blocks
+      KWClearStubsAndSpies();
+  }];
+}
+
+- (void)visitPendingNode:(KWPendingNode *)aNode {
+  if (aNode != exampleNode)
+    return;
+
+  [self reportResultForExampleNodeWithLabel:@"PENDING"];
+}
+
+- (NSString *)generateDescriptionForAnonymousItNode
+{
+  // anonymous specify blocks should only have one verifier, but use the first in any case
+  return [(self.verifiers)[0] descriptionForAnonymousItNode];
+}
+
+@end
+
+#pragma mark -
+#pragma mark Building Example Groups
+
+void describe(NSString *aDescription, KWVoidBlock aBlock) {
+    describeWithCallSite(nil, aDescription, aBlock);
+}
+
+void context(NSString *aDescription, KWVoidBlock aBlock) {
+    contextWithCallSite(nil, aDescription, aBlock);
+}
+
+void registerMatchers(NSString *aNamespacePrefix) {
+    registerMatchersWithCallSite(nil, aNamespacePrefix);
+}
+
+void beforeAll(KWVoidBlock aBlock) {
+    beforeAllWithCallSite(nil, aBlock);
+}
+
+void afterAll(KWVoidBlock aBlock) {
+    afterAllWithCallSite(nil, aBlock);
+}
+
+void beforeEach(KWVoidBlock aBlock) {
+    beforeEachWithCallSite(nil, aBlock);
+}
+
+void afterEach(KWVoidBlock aBlock) {
+    afterEachWithCallSite(nil, aBlock);
+}
+
+void it(NSString *aDescription, KWVoidBlock aBlock) {
+    itWithCallSite(nil, aDescription, aBlock);
+}
+
+void specify(KWVoidBlock aBlock)
+{
+    itWithCallSite(nil, nil, aBlock);
+}
+
+void pending_(NSString *aDescription, KWVoidBlock ignoredBlock) {
+    pendingWithCallSite(nil, aDescription, ignoredBlock);
+}
+
+void describeWithCallSite(KWCallSite *aCallSite, NSString *aDescription, KWVoidBlock aBlock) {
+    contextWithCallSite(aCallSite, aDescription, aBlock);
+}
+
+void contextWithCallSite(KWCallSite *aCallSite, NSString *aDescription, KWVoidBlock aBlock) {
+    [[KWExampleGroupBuilder sharedExampleGroupBuilder] pushContextNodeWithCallSite:aCallSite description:aDescription];
+    aBlock();
+    [[KWExampleGroupBuilder sharedExampleGroupBuilder] popContextNode];
+}
+
+void registerMatchersWithCallSite(KWCallSite *aCallSite, NSString *aNamespacePrefix) {
+    [[KWExampleGroupBuilder sharedExampleGroupBuilder] setRegisterMatchersNodeWithCallSite:aCallSite namespacePrefix:aNamespacePrefix];
+}
+
+void beforeAllWithCallSite(KWCallSite *aCallSite, KWVoidBlock aBlock) {
+    [[KWExampleGroupBuilder sharedExampleGroupBuilder] setBeforeAllNodeWithCallSite:aCallSite block:aBlock];
+}
+
+void afterAllWithCallSite(KWCallSite *aCallSite, KWVoidBlock aBlock) {
+    [[KWExampleGroupBuilder sharedExampleGroupBuilder] setAfterAllNodeWithCallSite:aCallSite block:aBlock];
+}
+
+void beforeEachWithCallSite(KWCallSite *aCallSite, KWVoidBlock aBlock) {
+    [[KWExampleGroupBuilder sharedExampleGroupBuilder] setBeforeEachNodeWithCallSite:aCallSite block:aBlock];
+}
+
+void afterEachWithCallSite(KWCallSite *aCallSite, KWVoidBlock aBlock) {
+    [[KWExampleGroupBuilder sharedExampleGroupBuilder] setAfterEachNodeWithCallSite:aCallSite block:aBlock];
+}
+
+void itWithCallSite(KWCallSite *aCallSite, NSString *aDescription, KWVoidBlock aBlock) {
+    [[KWExampleGroupBuilder sharedExampleGroupBuilder] addItNodeWithCallSite:aCallSite description:aDescription block:aBlock];
+}
+
+void pendingWithCallSite(KWCallSite *aCallSite, NSString *aDescription, KWVoidBlock ignoredBlock) {
+    [[KWExampleGroupBuilder sharedExampleGroupBuilder] addPendingNodeWithCallSite:aCallSite description:aDescription];
+}
Pods/Kiwi/Classes/KWExampleGroupBuilder.h
@@ -0,0 +1,45 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+#import "KWBlock.h"
+
+@class KWCallSite;
+@class KWExample;
+@class KWExampleSuite;
+
+@interface KWExampleGroupBuilder : NSObject {
+@private
+    NSMutableArray *contextNodeStack;
+    NSMutableSet *suites;
+}
+
+#pragma mark -
+#pragma mark Initializing
+
++ (id)sharedExampleGroupBuilder;
+
+#pragma mark -
+#pragma mark Building Example Groups
+
+@property (nonatomic, readonly) BOOL isBuildingExampleGroup;
+@property (nonatomic, retain, readonly) KWExampleSuite *exampleSuite;
+@property (nonatomic, retain) KWExample *currentExample;
+
+- (KWExampleSuite *)buildExampleGroups:(void (^)(void))buildingBlock;
+- (KWExample *)currentExample;
+
+- (void)pushContextNodeWithCallSite:(KWCallSite *)aCallSite description:(NSString *)aDescription;
+- (void)popContextNode;
+- (void)setRegisterMatchersNodeWithCallSite:(KWCallSite *)aCallSite namespacePrefix:(NSString *)aNamespacePrefix;
+- (void)setBeforeAllNodeWithCallSite:(KWCallSite *)aCallSite block:(KWVoidBlock)aBlock;
+- (void)setAfterAllNodeWithCallSite:(KWCallSite *)aCallSite block:(KWVoidBlock)aBlock;
+- (void)setBeforeEachNodeWithCallSite:(KWCallSite *)aCallSite block:(KWVoidBlock)aBlock;
+- (void)setAfterEachNodeWithCallSite:(KWCallSite *)aCallSite block:(KWVoidBlock)aBlock;
+- (void)addItNodeWithCallSite:(KWCallSite *)aCallSite description:(NSString *)aDescription block:(KWVoidBlock)aBlock;
+- (void)addPendingNodeWithCallSite:(KWCallSite *)aCallSite description:(NSString *)aDescription;
+
+@end
Pods/Kiwi/Classes/KWExampleGroupBuilder.m
@@ -0,0 +1,200 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWExampleGroupBuilder.h"
+#import "KWExample.h"
+#import "KWAfterAllNode.h"
+#import "KWAfterEachNode.h"
+#import "KWBeforeAllNode.h"
+#import "KWBeforeEachNode.h"
+#import "KWContextNode.h"
+#import "KWItNode.h"
+#import "KWPendingNode.h"
+#import "KWRegisterMatchersNode.h"
+#import "KWExampleSuite.h"
+
+
+@interface KWExampleGroupBuilder()
+
+#pragma mark -
+#pragma mark Building Example Groups
+
+@property (nonatomic, retain, readwrite) KWExampleSuite *exampleSuite;
+@property (nonatomic, readonly) NSMutableArray *contextNodeStack;
+
+@end
+
+@implementation KWExampleGroupBuilder
+
+@synthesize exampleSuite;
+@synthesize currentExample;
+
+#pragma mark -
+#pragma mark Initializing
+
+static KWExampleGroupBuilder *sharedExampleGroupBuilder = nil;
+
+- (id)init {
+    if ((self = [super init])) {
+        contextNodeStack = [[NSMutableArray alloc] init];
+        suites = [[NSMutableSet alloc] init];
+    }
+
+    return self;
+}
+
+- (void)dealloc {
+    [suites release];
+    [exampleSuite release];
+    [contextNodeStack release];
+    [super dealloc];
+}
+
++ (id)sharedExampleGroupBuilder {
+    if (sharedExampleGroupBuilder == nil) {
+        sharedExampleGroupBuilder = [[super allocWithZone:nil] init];
+    }
+
+    return sharedExampleGroupBuilder;
+}
+
++ (id)allocWithZone:(NSZone *)zone {
+    return [[self sharedExampleGroupBuilder] retain];
+}
+
+- (id)copyWithZone:(NSZone *)zone {
+    return self;
+}
+
+- (id)retain {
+    return self;
+}
+
+- (NSUInteger)retainCount {
+    return NSUIntegerMax;
+}
+
+- (oneway void)release {
+}
+
+- (id)autorelease {
+    return self;
+}
+
+#pragma mark -
+#pragma mark Building Example Groups
+
+@synthesize contextNodeStack;
+
+- (BOOL)isBuildingExampleGroup {
+    return [self.contextNodeStack count] > 0;
+}
+
+- (KWExampleSuite *)buildExampleGroups:(void (^)(void))buildingBlock
+{
+    KWContextNode *rootNode = [KWContextNode contextNodeWithCallSite:nil parentContext:nil description:nil];
+   
+    self.exampleSuite = [[[KWExampleSuite alloc] initWithRootNode:rootNode] autorelease];
+    
+    [suites addObject:self.exampleSuite];
+
+    [self.contextNodeStack addObject:rootNode];
+    buildingBlock();
+    [self.contextNodeStack removeAllObjects];
+    
+    return self.exampleSuite;
+}
+
+- (void)pushContextNodeWithCallSite:(KWCallSite *)aCallSite description:(NSString *)aDescription {
+    KWContextNode *contextNode = [self.contextNodeStack lastObject];
+    KWContextNode *node = [KWContextNode contextNodeWithCallSite:aCallSite parentContext:contextNode description:aDescription];
+    [contextNode addContextNode:node];
+    [self.contextNodeStack addObject:node];
+}
+
+- (void)popContextNode {
+    KWContextNode *contextNode = [self.contextNodeStack lastObject];
+    
+    [self.exampleSuite markLastExampleAsLastInContext:contextNode];
+    
+    if ([self.contextNodeStack count] == 1)
+        [NSException raise:@"KWExampleGroupBuilderException" format:@"there is no open context to pop"];
+
+    [self.contextNodeStack removeLastObject];
+}
+
+- (void)setRegisterMatchersNodeWithCallSite:(KWCallSite *)aCallSite namespacePrefix:(NSString *)aNamespacePrefix {
+    if ([self.contextNodeStack count] == 0)
+        [NSException raise:@"KWExampleGroupBuilderException" format:@"an example group has not been started"];
+
+    KWContextNode *contextNode = [self.contextNodeStack lastObject];
+    KWRegisterMatchersNode *registerMatchersNode = [KWRegisterMatchersNode registerMatchersNodeWithCallSite:aCallSite namespacePrefix:aNamespacePrefix];
+    [contextNode setRegisterMatchersNode:registerMatchersNode];
+}
+
+- (void)setBeforeAllNodeWithCallSite:(KWCallSite *)aCallSite block:(KWVoidBlock)aBlock {
+    if ([self.contextNodeStack count] == 0)
+        [NSException raise:@"KWExampleGroupBuilderException" format:@"an example group has not been started"];
+
+    KWContextNode *contextNode = [self.contextNodeStack lastObject];
+    KWBeforeAllNode *beforeAllNode = [KWBeforeAllNode beforeAllNodeWithCallSite:aCallSite block:aBlock];
+    [contextNode setBeforeAllNode:beforeAllNode];
+}
+
+- (void)setAfterAllNodeWithCallSite:(KWCallSite *)aCallSite block:(KWVoidBlock)aBlock {
+    if ([self.contextNodeStack count] == 0)
+        [NSException raise:@"KWExampleGroupBuilderException" format:@"an example group has not been started"];
+
+    KWContextNode *contextNode = [self.contextNodeStack lastObject];
+    KWAfterAllNode *afterAllNode = [KWAfterAllNode afterAllNodeWithCallSite:aCallSite block:aBlock];
+    [contextNode setAfterAllNode:afterAllNode];
+}
+
+- (void)setBeforeEachNodeWithCallSite:(KWCallSite *)aCallSite block:(KWVoidBlock)aBlock {
+    if ([self.contextNodeStack count] == 0)
+        [NSException raise:@"KWExampleGroupBuilderException" format:@"an example group has not been started"];
+
+    KWContextNode *contextNode = [self.contextNodeStack lastObject];
+    KWBeforeEachNode *beforeEachNode = [KWBeforeEachNode beforeEachNodeWithCallSite:aCallSite block:aBlock];
+    [contextNode setBeforeEachNode:beforeEachNode];
+}
+
+- (void)setAfterEachNodeWithCallSite:(KWCallSite *)aCallSite block:(KWVoidBlock)aBlock {
+    if ([self.contextNodeStack count] == 0)
+        [NSException raise:@"KWExampleGroupBuilderException" format:@"an example group has not been started"];
+
+    KWContextNode *contextNode = [self.contextNodeStack lastObject];
+    KWAfterEachNode *afterEachNode = [KWAfterEachNode afterEachNodeWithCallSite:aCallSite block:aBlock];
+    [contextNode setAfterEachNode:afterEachNode];
+}
+
+- (void)addItNodeWithCallSite:(KWCallSite *)aCallSite description:(NSString *)aDescription block:(KWVoidBlock)aBlock {
+    if ([self.contextNodeStack count] == 0)
+        [NSException raise:@"KWExampleGroupBuilderException" format:@"an example group has not been started"];
+
+    KWContextNode *contextNode = [self.contextNodeStack lastObject];
+    KWItNode* itNode = [KWItNode itNodeWithCallSite:aCallSite description:aDescription context:contextNode block:aBlock];
+    [contextNode addItNode:itNode];
+    
+    KWExample *example = [[KWExample alloc] initWithExampleNode:itNode];
+    [self.exampleSuite addExample:example];
+    [example release];
+}
+
+- (void)addPendingNodeWithCallSite:(KWCallSite *)aCallSite description:(NSString *)aDescription {
+    if ([self.contextNodeStack count] == 0)
+        [NSException raise:@"KWExampleGroupBuilderException" format:@"an example group has not been started"];
+
+    KWContextNode *contextNode = [self.contextNodeStack lastObject];
+    KWPendingNode *pendingNode = [KWPendingNode pendingNodeWithCallSite:aCallSite context:contextNode description:aDescription];
+    [contextNode addPendingNode:pendingNode];
+    
+    KWExample *example = [[KWExample alloc] initWithExampleNode:pendingNode];
+    [self.exampleSuite addExample:example];
+    [example release];
+}
+
+@end
Pods/Kiwi/Classes/KWExampleGroupDelegate.h
@@ -0,0 +1,18 @@
+//
+//  KWExampleGroupDelegate.h
+//  Kiwi
+//
+//  Created by Luke Redpath on 08/09/2011.
+//  Copyright 2011 Allen Ding. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+@class KWExample;
+@class KWFailure;
+
+@protocol KWExampleDelegate <NSObject>
+
+- (void)example:(KWExample *)example didFailWithFailure:(KWFailure *)failure;
+
+@end
Pods/Kiwi/Classes/KWExampleNode.h
@@ -0,0 +1,23 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+
+@class KWContextNode;
+@protocol KWExampleNodeVisitor;
+
+@protocol KWExampleNode<NSObject>
+
+#pragma mark -
+#pragma mark Accepting Visitors
+
+- (void)acceptExampleNodeVisitor:(id<KWExampleNodeVisitor>)aVisitor;
+
+@optional
+
+- (NSArray *)contextStack;
+
+@end
Pods/Kiwi/Classes/KWExampleNodeVisitor.h
@@ -0,0 +1,34 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+
+@class KWAfterAllNode;
+@class KWAfterEachNode;
+@class KWBeforeAllNode;
+@class KWBeforeEachNode;
+@class KWContextNode;
+@class KWItNode;
+@class KWPendingNode;
+@class KWRegisterMatchersNode;
+
+@protocol KWExampleNodeVisitor<NSObject>
+
+#pragma mark -
+#pragma mark Visiting Nodes
+
+@optional
+
+- (void)visitContextNode:(KWContextNode *)aNode;
+- (void)visitRegisterMatchersNode:(KWRegisterMatchersNode *)aNode;
+- (void)visitBeforeAllNode:(KWBeforeAllNode *)aNode;
+- (void)visitAfterAllNode:(KWAfterAllNode *)aNode;
+- (void)visitBeforeEachNode:(KWBeforeEachNode *)aNode;
+- (void)visitAfterEachNode:(KWAfterEachNode *)aNode;
+- (void)visitItNode:(KWItNode *)aNode;
+- (void)visitPendingNode:(KWPendingNode *)aNode;
+
+@end
Pods/Kiwi/Classes/KWExampleSuite.h
@@ -0,0 +1,29 @@
+//
+//  KWExampleSuite.h
+//  Kiwi
+//
+//  Created by Luke Redpath on 17/10/2011.
+//  Copyright (c) 2011 Allen Ding. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+#import "KWExampleNodeVisitor.h"
+
+@class KWContextNode;
+@class KWExample;
+@class SenTestCase;
+
+@interface KWExampleSuite : NSObject <KWExampleNodeVisitor> {
+  KWContextNode *rootNode;
+  NSMutableArray *examples;
+}
+- (id)initWithRootNode:(KWContextNode *)contextNode;
+- (void)addExample:(KWExample *)example;
+- (void)markLastExampleAsLastInContext:(KWContextNode *)context;
+- (NSArray *)invocationsForTestCase;
+@end
+
+@interface NSInvocation (KWExampleGroup)
+- (void)kw_setExample:(KWExample *)exampleGroup;
+- (KWExample *)kw_example;
+@end
Pods/Kiwi/Classes/KWExampleSuite.m
@@ -0,0 +1,87 @@
+//
+//  KWExampleSuite.m
+//  Kiwi
+//
+//  Created by Luke Redpath on 17/10/2011.
+//  Copyright (c) 2011 Allen Ding. All rights reserved.
+//
+
+#import "KWExampleSuite.h"
+#import "KWExample.h"
+#import "KWStringUtilities.h"
+#import "KWBeforeAllNode.h"
+#import "KWAfterAllNode.h"
+#import "NSMethodSignature+KiwiAdditions.h"
+#import <objc/runtime.h>
+
+#define kKWINVOCATION_EXAMPLE_GROUP_KEY @"__KWExampleGroupKey"
+
+@implementation KWExampleSuite
+
+- (id)initWithRootNode:(KWContextNode *)contextNode
+{
+  if ((self = [super init])) {
+    rootNode = [contextNode retain];
+    examples = [[NSMutableArray alloc] init];
+  }
+  return self;
+}
+
+- (void)dealloc 
+{
+  [examples release];
+  [rootNode release];
+  [super dealloc];
+}
+
+- (void)addExample:(KWExample *)example
+{
+  [examples addObject:example];
+  [example setSuite:self];
+}
+
+- (void)markLastExampleAsLastInContext:(KWContextNode *)context
+{
+  if ([examples count] > 0) {
+    KWExample *lastExample = (KWExample *)[examples lastObject];
+    [lastExample.lastInContexts addObject:context];
+  }
+}
+
+- (NSArray *)invocationsForTestCase;
+{
+  NSMutableArray *invocations = [NSMutableArray array];
+  
+  // Add a single dummy invocation for each example group
+  
+  for (KWExample *exampleGroup in examples) {
+    NSMethodSignature *methodSignature = [NSMethodSignature signatureWithObjCTypes:[KWEncodingForVoidMethod() UTF8String]];
+    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSignature];
+    [invocations addObject:invocation];
+    [invocation kw_setExample:exampleGroup];
+  }
+  
+  return invocations;
+}
+
+@end
+
+#pragma mark -
+
+// because SenTest will modify the invocation target, we'll have to store 
+// another reference to the example group so we can retrieve it later
+
+@implementation NSInvocation (KWExampleGroup)
+
+- (void)kw_setExample:(KWExample *)exampleGroup
+{
+  objc_setAssociatedObject(self, kKWINVOCATION_EXAMPLE_GROUP_KEY, exampleGroup, OBJC_ASSOCIATION_RETAIN);    
+}
+
+- (KWExample *)kw_example
+{
+  return objc_getAssociatedObject(self, kKWINVOCATION_EXAMPLE_GROUP_KEY);
+}
+
+@end
+
Pods/Kiwi/Classes/KWExistVerifier.h
@@ -0,0 +1,35 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+#import "KWExpectationType.h"
+#import "KWVerifying.h"
+
+@class KWCallSite;
+
+@protocol KWReporting;
+
+@interface KWExistVerifier : NSObject<KWVerifying> {
+@private
+    KWExpectationType expectationType;
+    KWCallSite *callSite;
+    id<KWReporting> reporter;
+    id subject;
+}
+
+#pragma mark -
+#pragma mark Initializing
+
+- (id)initWithExpectationType:(KWExpectationType)anExpectationType callSite:(KWCallSite *)aCallSite reporter:(id<KWReporting>)aReporter;
+
++ (id)existVerifierWithExpectationType:(KWExpectationType)anExpectationType callSite:(KWCallSite *)aCallSite reporter:(id<KWReporting>)aReporter;
+
+#pragma mark -
+#pragma mark Properties
+
+@property (nonatomic, readwrite, retain) id subject;
+
+@end
Pods/Kiwi/Classes/KWExistVerifier.m
@@ -0,0 +1,78 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWExistVerifier.h"
+#import "KWFailure.h"
+#import "KWFormatter.h"
+#import "KWReporting.h"
+
+@interface KWExistVerifier()
+
+#pragma mark -
+#pragma mark Properties
+
+@property (nonatomic, readonly) KWExpectationType expectationType;
+@property (nonatomic, readonly) KWCallSite *callSite;
+@property (nonatomic, readonly) id<KWReporting> reporter;
+
+@end
+
+@implementation KWExistVerifier
+
+#pragma mark -
+#pragma mark Initializing
+
+- (id)initWithExpectationType:(KWExpectationType)anExpectationType callSite:(KWCallSite *)aCallSite reporter:(id<KWReporting>)aReporter {
+    if ((self = [super init])) {
+        expectationType = anExpectationType;
+        callSite = [aCallSite retain];
+        reporter = aReporter;
+    }
+
+    return self;
+}
+
++ (id)existVerifierWithExpectationType:(KWExpectationType)anExpectationType callSite:(KWCallSite *)aCallSite reporter:(id<KWReporting>)aReporter {
+    return [[[self alloc] initWithExpectationType:anExpectationType callSite:aCallSite reporter:aReporter] autorelease];
+}
+
+- (void)dealloc {
+    [callSite release];
+    [subject release];
+    [super dealloc];
+}
+
+- (NSString *)descriptionForAnonymousItNode
+{
+  if (self.expectationType == KWExpectationTypeShould) {
+    return @"should exist";
+  }
+  return @"should not exist";
+}
+
+#pragma mark -
+#pragma mark Properties
+
+@synthesize expectationType;
+@synthesize callSite;
+@synthesize reporter;
+@synthesize subject;
+
+#pragma mark -
+#pragma mark Ending Examples
+
+- (void)exampleWillEnd {
+    if (self.expectationType == KWExpectationTypeShould && self.subject == nil) {
+        KWFailure *failure = [KWFailure failureWithCallSite:self.callSite message:@"expected subject not to be nil"];
+        [self.reporter reportFailure:failure];
+    } else if (self.expectationType == KWExpectationTypeShouldNot && self.subject != nil) {
+        KWFailure *failure = [KWFailure failureWithCallSite:self.callSite format:@"expected subject to be nil, got %@",
+                                                                                 [KWFormatter formatObject:self.subject]];
+        [self.reporter reportFailure:failure];
+    }
+}
+
+@end
Pods/Kiwi/Classes/KWExpectationType.h
@@ -0,0 +1,15 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+
+enum {
+    KWExpectationTypeShould,
+    KWExpectationTypeShouldNot,
+    KWExpectationTypeMaybe
+};
+
+typedef NSUInteger KWExpectationType;
Pods/Kiwi/Classes/KWFailure.h
@@ -0,0 +1,37 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+
+@class KWCallSite;
+
+@interface KWFailure : NSObject {
+@private
+    KWCallSite *callSite;
+    NSString *message;
+}
+
+#pragma mark -
+#pragma mark Initializing
+
+- (id)initWithCallSite:(KWCallSite *)aCallSite message:(NSString *)aMessage;
+- (id)initWithCallSite:(KWCallSite *)aCallSite format:(NSString *)format, ...;
+
++ (id)failureWithCallSite:(KWCallSite *)aCallSite message:(NSString *)aMessage;
++ (id)failureWithCallSite:(KWCallSite *)aCallSite format:(NSString *)format, ...;
+
+#pragma mark -
+#pragma mark Properties
+
+@property (nonatomic, readonly) NSString *message;
+@property (nonatomic, readonly) KWCallSite *callSite;
+
+#pragma mark -
+#pragma mark Getting Exception Representations
+
+- (NSException *)exceptionValue;
+
+@end
Pods/Kiwi/Classes/KWFailure.m
@@ -0,0 +1,68 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWFailure.h"
+#import <SenTestingKit/SenTestingKit.h>
+#import "KWCallSite.h"
+
+@implementation KWFailure
+
+#pragma mark -
+#pragma mark Initializing
+
+- (id)initWithCallSite:(KWCallSite *)aCallSite message:(NSString *)aMessage {
+    if ((self = [super init])) {
+        callSite = [aCallSite retain];
+        message = [aMessage copy];
+    }
+
+    return self;
+}
+
+- (id)initWithCallSite:(KWCallSite *)aCallSite format:(NSString *)format, ... {
+    va_list argumentList;
+    va_start(argumentList, format);
+    NSString *aMessage = [[[NSString alloc] initWithFormat:format arguments:argumentList] autorelease];
+    return [self initWithCallSite:aCallSite message:aMessage];
+}
+
++ (id)failureWithCallSite:(KWCallSite *)aCallSite message:(NSString *)aMessage {
+    return [[[self alloc] initWithCallSite:aCallSite message:aMessage] autorelease];
+}
+
++ (id)failureWithCallSite:(KWCallSite *)aCallSite format:(NSString *)format, ... {
+    va_list argumentList;
+    va_start(argumentList, format);
+    NSString *message = [[[NSString alloc] initWithFormat:format arguments:argumentList] autorelease];
+    return [self failureWithCallSite:aCallSite message:message];
+}
+
+- (void)dealloc {
+    [callSite release];
+    [message release];
+    [super dealloc];
+}
+
+#pragma mark -
+#pragma mark Properties
+
+@synthesize message;
+@synthesize callSite;
+
+#pragma mark -
+#pragma mark Getting Exception Representations
+
+- (NSException *)exceptionValue {
+    NSDictionary *userInfo = nil;
+    if (self.callSite) {
+        NSNumber *lineNumber = @(self.callSite.lineNumber);
+        userInfo = @{SenTestFilenameKey: self.callSite.filename,
+                                                                            SenTestLineNumberKey: lineNumber};
+    }
+    return [NSException exceptionWithName:@"KWFailureException" reason:message userInfo:userInfo];
+}
+
+@end
Pods/Kiwi/Classes/KWFormatter.h
@@ -0,0 +1,16 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+
+@interface KWFormatter : NSObject
+
+#pragma mark -
+#pragma mark Getting Descriptions
+
++ (NSString *)formatObject:(id)anObject;
+
+@end
Pods/Kiwi/Classes/KWFormatter.m
@@ -0,0 +1,51 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWFormatter.h"
+
+@implementation KWFormatter
+
+
+#pragma mark - Getting Descriptions
+
++ (NSString *)formatObject:(id)anObject {
+    if ([anObject isKindOfClass:[NSString class]])
+        return [NSString stringWithFormat:@"\"%@\"", anObject];
+
+    else if ([anObject isKindOfClass:[NSDictionary class]])
+        return [anObject description]; // NSDictionary conforms to NSFastEnumeration
+
+    else if ([anObject conformsToProtocol:@protocol(NSFastEnumeration)])
+        return [self formattedCollection:anObject];
+
+    return [anObject description];
+}
+
+
+
+#pragma mark - Private
+
++ (NSString *)formattedCollection:(id<NSFastEnumeration>)collection {
+
+    NSMutableString *description = [[[NSMutableString alloc] initWithString:@"("] autorelease];
+    NSUInteger index = 0;
+    
+    for (id object in collection) {
+        if (index == 0)
+            [description appendFormat:@"%@", [self formatObject:object]];
+        else
+            [description appendFormat:@", %@", [self formatObject:object]];
+        
+        ++index;
+    }
+    
+    [description appendString:@")"];
+    return description;
+}
+
+
+
+@end
Pods/Kiwi/Classes/KWFutureObject.h
@@ -0,0 +1,20 @@
+//
+//  KWFutureObject.h
+//  iOSFalconCore
+//
+//  Created by Luke Redpath on 13/01/2011.
+//  Copyright 2011 LJR Software Limited. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+typedef id (^KWFutureObjectBlock)(void);
+
+@interface KWFutureObject : NSObject {
+  KWFutureObjectBlock block;
+}
++ (id)objectWithObjectPointer:(id *)pointer;
++ (id)futureObjectWithBlock:(KWFutureObjectBlock)block;
+- (id)initWithBlock:(KWFutureObjectBlock)aBlock;
+- (id)object;
+@end
Pods/Kiwi/Classes/KWFutureObject.m
@@ -0,0 +1,43 @@
+//
+//  KWFutureObject.m
+//  iOSFalconCore
+//
+//  Created by Luke Redpath on 13/01/2011.
+//  Copyright 2011 LJR Software Limited. All rights reserved.
+//
+
+#import "KWFutureObject.h"
+
+
+@implementation KWFutureObject
+
++ (id)objectWithObjectPointer:(id *)pointer;
+{
+  return [self futureObjectWithBlock:^{ return *pointer; }];
+}
+
++ (id)futureObjectWithBlock:(KWFutureObjectBlock)block;
+{
+  return [[[self alloc] initWithBlock:block] autorelease];
+}
+
+- (id)initWithBlock:(KWFutureObjectBlock)aBlock;
+{
+  if ((self = [super init])) {
+    block = [aBlock copy];
+  }
+  return self;
+}
+
+- (id)object;
+{
+  return block();
+}
+
+- (void)dealloc
+{
+  [block release];
+  [super dealloc];
+}
+
+@end
Pods/Kiwi/Classes/KWGenericMatcher.h
@@ -0,0 +1,19 @@
+//
+//  KWGenericMatcher.h
+//  Kiwi
+//
+//  Created by Luke Redpath on 24/01/2011.
+//  Copyright 2011 Allen Ding. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+#import "KWMatcher.h"
+
+@interface KWGenericMatcher : KWMatcher
+
+#pragma mark -
+#pragma mark Configuring Matchers
+
+- (void)match:(id)aMatcher;
+
+@end
Pods/Kiwi/Classes/KWGenericMatcher.m
@@ -0,0 +1,62 @@
+//
+//  KWGenericMatcher.m
+//  Kiwi
+//
+//  Created by Luke Redpath on 24/01/2011.
+//  Copyright 2011 Allen Ding. All rights reserved.
+//
+
+#import "KWGenericMatcher.h"
+#import "KWGenericMatchEvaluator.h"
+
+@interface KWGenericMatcher ()
+
+#pragma mark -
+#pragma mark Properties
+
+@property (nonatomic, retain) id matcher;
+
+@end
+
+@implementation KWGenericMatcher
+
+@synthesize matcher;
+
+- (void)dealloc
+{
+  [matcher release];
+  [super dealloc];
+}
+
+#pragma mark -
+#pragma mark Matching
+
+- (BOOL)evaluate {
+    return [KWGenericMatchEvaluator genericMatcher:self.matcher matches:self.subject];
+}
+
+- (NSString *)failureMessageForShould {
+  return [NSString stringWithFormat:@"expected subject to match %@", self.matcher];
+}
+
+- (NSString *)description
+{
+  return [NSString stringWithFormat:@"match %@", [self.matcher description]];
+}
+
+#pragma mark -
+#pragma mark Getting Matcher Strings
+
++ (NSArray *)matcherStrings {
+  return @[@"match:"];
+}
+
+#pragma mark -
+#pragma mark Configuring Matchers
+
+- (void)match:(id)aMatcher;
+{
+    self.matcher = aMatcher;
+}
+
+@end
Pods/Kiwi/Classes/KWGenericMatchEvaluator.h
@@ -0,0 +1,17 @@
+//
+//  KWGenericMatcher.h
+//  Kiwi
+//
+//  Created by Allen Ding on 1/31/13.
+//  Copyright (c) 2013 Allen Ding. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+@interface KWGenericMatchEvaluator : NSObject
+
++ (BOOL)isGenericMatcher:(id)object;
+
++ (BOOL)genericMatcher:(id)matcher matches:(id)object;
+
+@end
Pods/Kiwi/Classes/KWGenericMatchEvaluator.m
@@ -0,0 +1,67 @@
+//
+//  KWGenericMatcher.m
+//  Kiwi
+//
+//  Created by Allen Ding on 1/31/13.
+//  Copyright (c) 2013 Allen Ding. All rights reserved.
+//
+
+#import "KWGenericMatchEvaluator.h"
+#import "KWStringUtilities.h"
+#import "KWObjCUtilities.h"
+#import <objc/runtime.h>
+
+@implementation KWGenericMatchEvaluator
+
+// Returns true only if the object has a method with the signature "- (void)matches:(id)object"
++ (BOOL)isGenericMatcher:(id)object
+{
+    Class theClass = object_getClass(object);
+
+    if (theClass == NULL) {
+        return NO;
+    }
+
+    Method method = class_getInstanceMethod(theClass, @selector(matches:));
+
+    if (method == NULL) {
+        return NO;
+    }
+
+    const char *cEncoding = method_getTypeEncoding(method);
+
+    if (cEncoding == NULL) {
+        return NO;
+    }
+
+    NSMethodSignature *signature = [NSMethodSignature signatureWithObjCTypes:cEncoding];
+
+    if (!KWObjCTypeEqualToObjCType(@encode(BOOL), [signature methodReturnType])) {
+        return NO;
+    }
+
+    if ([signature numberOfArguments] != 3) {
+        return NO;
+    }
+
+    if (!KWObjCTypeEqualToObjCType(@encode(id), [signature getArgumentTypeAtIndex:2])) {
+        return NO;
+    }
+
+    return YES;
+}
+
++ (BOOL)genericMatcher:(id)matcher matches:(id)object
+{
+    NSString *targetEncoding = KWEncodingWithObjCTypes(@encode(BOOL), @encode(id), @encode(SEL), @encode(id), nil);
+    NSMethodSignature *signature = [NSMethodSignature signatureWithObjCTypes:[targetEncoding UTF8String]];
+    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
+    [invocation setSelector:@selector(matches:)];
+    [invocation setArgument:&object atIndex:2];
+    [invocation invokeWithTarget:matcher];
+    BOOL result = NO;
+    [invocation getReturnValue:&result];
+    return result;
+}
+
+@end
Pods/Kiwi/Classes/KWGenericMatchingAdditions.h
@@ -0,0 +1,34 @@
+//
+//  NSObject+KiwiAdditions.h
+//  Kiwi
+//
+//  Created by Luke Redpath on 24/01/2011.
+//  Copyright 2011 Allen Ding. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+@interface NSObject (KiwiGenericMatchingAdditions)
+
+- (BOOL)isEqualOrMatches:(id)object;
+
+@end
+
+@interface NSArray (KiwiGenericMatchingAdditions)
+
+- (BOOL)containsObjectEqualToOrMatching:(id)object;
+- (BOOL)containsObjectMatching:(id)matcher;
+
+@end
+
+@interface NSSet (KiwiGenericMatchingAdditions)
+
+- (BOOL)containsObjectEqualToOrMatching:(id)object;
+
+@end
+
+@interface NSOrderedSet (KiwiGenericMatchingAdditions)
+
+- (BOOL)containsObjectEqualToOrMatching:(id)object;
+
+@end
\ No newline at end of file
Pods/Kiwi/Classes/KWGenericMatchingAdditions.m
@@ -0,0 +1,72 @@
+//
+//  NSObject+KiwiAdditions.m
+//  Kiwi
+//
+//  Created by Luke Redpath on 24/01/2011.
+//  Copyright 2011 Allen Ding. All rights reserved.
+//
+
+#import "KWGenericMatchingAdditions.h"
+#import "KWGenericMatcher.h"
+#import "KWGenericMatchEvaluator.h"
+
+@implementation NSObject (KiwiGenericMatchingAdditions)
+
+- (BOOL)isEqualOrMatches:(id)object
+{
+    if ([KWGenericMatchEvaluator isGenericMatcher:self]) {
+        return [KWGenericMatchEvaluator genericMatcher:self matches:object];
+    }
+    return [self isEqual:object];
+}
+
+@end
+
+@implementation NSArray (KiwiGenericMatchingAdditions)
+
+- (BOOL)containsObjectEqualToOrMatching:(id)object
+{
+    if ([KWGenericMatchEvaluator isGenericMatcher:object]) {
+        return [self containsObjectMatching:object];
+    }
+    return [self containsObject:object];
+}
+
+- (BOOL)containsObjectMatching:(id)matcher
+{
+    NSIndexSet *indexSet = [self indexesOfObjectsPassingTest:^(id obj, NSUInteger idx, BOOL *stop) {
+        BOOL matches = [KWGenericMatchEvaluator genericMatcher:matcher matches:obj];
+        if (matches) {
+            *stop = YES;
+        }
+        return matches;
+    }];
+
+    return (indexSet.count > 0);
+}
+
+@end
+
+@implementation NSSet (KiwiGenericMatchingAdditions)
+
+- (BOOL)containsObjectEqualToOrMatching:(id)object
+{
+    if ([KWGenericMatchEvaluator isGenericMatcher:object]) {
+        return [[self allObjects] containsObjectMatching:object];
+    }
+    return [self containsObject:object];
+}
+
+@end
+
+@implementation NSOrderedSet (KiwiGenericMatchingAdditions)
+
+- (BOOL)containsObjectEqualToOrMatching:(id)object
+{
+    if ([KWGenericMatchEvaluator isGenericMatcher:object]) {
+        return [[self array] containsObjectMatching:object];
+    }
+    return [self containsObject:object];
+}
+
+@end
Pods/Kiwi/Classes/KWHaveMatcher.h
@@ -0,0 +1,54 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+#import "KWCountType.h"
+#import "KWMatcher.h"
+#import "KWMatchVerifier.h"
+
+@interface KWHaveMatcher : KWMatcher {
+@private
+    KWCountType countType;
+    NSUInteger count;
+    NSInvocation *invocation;
+    NSUInteger actualCount;
+}
+
+#pragma mark -
+#pragma mark Configuring Matchers
+
+- (void)haveCountOf:(NSUInteger)aCount;
+- (void)haveCountOfAtLeast:(NSUInteger)aCount;
+- (void)haveCountOfAtMost:(NSUInteger)aCount;
+- (void)have:(NSUInteger)aCount itemsForInvocation:(NSInvocation *)anInvocation;
+- (void)haveAtLeast:(NSUInteger)aCount itemsForInvocation:(NSInvocation *)anInvocation;
+- (void)haveAtMost:(NSUInteger)aCount itemsForInvocation:(NSInvocation *)anInvocation;
+
+@end
+
+@protocol KWContainmentCountMatcherTerminals
+
+#pragma mark -
+#pragma mark Terminals
+
+- (id)objects;
+- (id)items;
+- (id)elements;
+
+@end
+
+@interface KWMatchVerifier(KWHaveMatcherAdditions)
+
+#pragma mark -
+#pragma mark Verifying
+
+#pragma mark Invocation Capturing Methods
+
+- (id)have:(NSUInteger)aCount;
+- (id)haveAtLeast:(NSUInteger)aCount;
+- (id)haveAtMost:(NSUInteger)aCount;
+
+@end
Pods/Kiwi/Classes/KWHaveMatcher.m
@@ -0,0 +1,262 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWHaveMatcher.h"
+#import "KWFormatter.h"
+#import "KWInvocationCapturer.h"
+#import "KWObjCUtilities.h"
+#import "KWStringUtilities.h"
+
+static NSString * const MatchVerifierKey = @"MatchVerifierKey";
+static NSString * const CountTypeKey = @"CountTypeKey";
+static NSString * const CountKey = @"CountKey";
+
+@interface KWHaveMatcher()
+
+#pragma mark -
+#pragma mark Properties
+
+@property (nonatomic, readwrite) KWCountType countType;
+@property (nonatomic, readwrite) NSUInteger count;
+@property (nonatomic, readwrite, retain) NSInvocation *invocation;
+@property (nonatomic, readwrite) NSUInteger actualCount;
+
+@end
+
+@implementation KWHaveMatcher
+
+#pragma mark -
+#pragma mark Initializing
+
+- (void)dealloc {
+    [invocation release];
+    [super dealloc];
+}
+
+#pragma mark -
+#pragma mark Properties
+
+@synthesize countType;
+@synthesize count;
+@synthesize invocation;
+@synthesize actualCount;
+
+#pragma mark -
+#pragma mark Getting Matcher Strings
+
++ (NSArray *)matcherStrings {
+    return @[@"haveCountOf:",
+                                     @"haveCountOfAtLeast:",
+                                     @"haveCountOfAtMost:",
+                                     @"have:itemsForInvocation:",
+                                     @"haveAtLeast:itemsForInvocation:",
+                                     @"haveAtMost:itemsForInvocation:"];
+}
+
+#pragma mark -
+#pragma mark Matching
+
+- (id)targetObject {
+    if (self.invocation == nil)
+        return self.subject;
+
+    SEL selector = [self.invocation selector];
+
+    if ([self.subject respondsToSelector:selector]) {
+        NSMethodSignature *signature = [self.subject methodSignatureForSelector:selector];
+
+        if (!KWObjCTypeIsObject([signature methodReturnType]))
+            [NSException raise:@"KWMatcherEception" format:@"a valid collection was not specified"];
+
+        id object = nil;
+        [self.invocation invokeWithTarget:self.subject];
+        [self.invocation getReturnValue:&object];
+        return object;
+    } else if (KWSelectorParameterCount(selector) == 0) {
+        return self.subject;
+    } else {
+        return nil;
+    }
+}
+
+- (BOOL)evaluate {
+    id targetObject = [self targetObject];
+
+    if ([targetObject respondsToSelector:@selector(count)])
+        self.actualCount = [targetObject count];
+    else if ([targetObject respondsToSelector:@selector(length)])
+        self.actualCount = [targetObject length];
+    else
+        self.actualCount = 0;
+
+    switch (self.countType) {
+    case KWCountTypeExact:
+        return self.actualCount == self.count;
+    case KWCountTypeAtLeast:
+        return self.actualCount >= self.count;
+    case KWCountTypeAtMost:
+        return self.actualCount <= self.count;
+    }
+
+    assert(0 && "should never reach here");
+    return NO;
+}
+
+#pragma mark -
+#pragma mark Getting Failure Messages
+
+- (NSString *)verbPhrase {
+    switch (self.countType) {
+        case KWCountTypeExact:
+            return @"have";
+        case KWCountTypeAtLeast:
+            return @"have at least";
+        case KWCountTypeAtMost:
+            return @"have at most";
+    }
+
+    assert(0 && "should never reach here");
+    return nil;
+}
+
+- (NSString *)itemPhrase {
+    if (self.invocation == nil)
+        return @"items";
+    else
+        return NSStringFromSelector([self.invocation selector]);
+}
+
+- (NSString *)actualCountPhrase {
+    if (self.actualCount == 1)
+        return @"1 item";
+    else
+        return [NSString stringWithFormat:@"%u items", (unsigned)self.actualCount];
+}
+
+- (NSString *)failureMessageForShould {
+    return [NSString stringWithFormat:@"expected subject to %@ %u %@, got %@",
+                                      [self verbPhrase],
+                                      (unsigned)self.count,
+                                      [self itemPhrase],
+                                      [self actualCountPhrase]];
+}
+
+- (NSString *)failureMessageForShouldNot {
+    return [NSString stringWithFormat:@"expected subject not to %@ %u %@",
+                                      [self verbPhrase],
+                                      (unsigned)self.count,
+                                      [self itemPhrase]];
+}
+
+#pragma mark -
+#pragma mark Description
+
+- (NSString *)description
+{
+  return [NSString stringWithFormat:@"%@ %u %@", [self verbPhrase], (unsigned)self.count, [self itemPhrase]];
+}
+
+#pragma mark -
+#pragma mark Configuring Matchers
+
+- (void)haveCountOf:(NSUInteger)aCount {
+    self.count = aCount;
+    self.countType = KWCountTypeExact;
+}
+
+- (void)haveCountOfAtLeast:(NSUInteger)aCount {
+    self.count = aCount;
+    self.countType = KWCountTypeAtLeast;
+}
+
+- (void)haveCountOfAtMost:(NSUInteger)aCount {
+    self.count = aCount;
+    self.countType = KWCountTypeAtMost;
+}
+
+- (void)have:(NSUInteger)aCount itemsForInvocation:(NSInvocation *)anInvocation {
+    self.count = aCount;
+    self.countType = KWCountTypeExact;
+    self.invocation = anInvocation;
+}
+
+- (void)haveAtLeast:(NSUInteger)aCount itemsForInvocation:(NSInvocation *)anInvocation {
+    self.count = aCount;
+    self.countType = KWCountTypeAtLeast;
+    self.invocation = anInvocation;
+}
+
+- (void)haveAtMost:(NSUInteger)aCount itemsForInvocation:(NSInvocation *)anInvocation {
+    self.count = aCount;
+    self.countType = KWCountTypeAtMost;
+    self.invocation = anInvocation;
+}
+
+#pragma mark -
+#pragma mark Capturing Invocations
+
++ (NSMethodSignature *)invocationCapturer:(KWInvocationCapturer *)anInvocationCapturer methodSignatureForSelector:(SEL)aSelector {
+    KWMatchVerifier *verifier = (anInvocationCapturer.userInfo)[MatchVerifierKey];
+
+    if ([verifier.subject respondsToSelector:aSelector])
+        return [verifier.subject methodSignatureForSelector:aSelector];
+
+    // Arbitrary selectors are allowed as expectation expression terminals when
+    // the subject itself is a collection, so return a dummy method signature.
+    NSString *encoding = KWEncodingForVoidMethod();
+    return [NSMethodSignature signatureWithObjCTypes:[encoding UTF8String]];
+}
+
++ (void)invocationCapturer:(KWInvocationCapturer *)anInvocationCapturer didCaptureInvocation:(NSInvocation *)anInvocation {
+    NSDictionary *userInfo = anInvocationCapturer.userInfo;
+    id verifier = userInfo[MatchVerifierKey];
+    KWCountType countType = [userInfo[CountTypeKey] unsignedIntegerValue];
+    NSUInteger count = [userInfo[CountKey] unsignedIntegerValue];
+
+    switch (countType) {
+        case KWCountTypeExact:
+            [verifier have:count itemsForInvocation:anInvocation];
+            break;
+        case KWCountTypeAtLeast:
+            [verifier haveAtLeast:count itemsForInvocation:anInvocation];
+            break;
+        case KWCountTypeAtMost:
+            [verifier haveAtMost:count itemsForInvocation:anInvocation];
+            break;
+    }
+}
+
+@end
+
+@implementation KWMatchVerifier(KWHaveMatcherAdditions)
+
+#pragma mark -
+#pragma mark Verifying
+
+#pragma mark Invocation Capturing Methods
+
+- (NSDictionary *)userInfoForHaveMatcherWithCountType:(KWCountType)aCountType count:(NSUInteger)aCount {
+    return @{MatchVerifierKey: self,
+                                                      CountTypeKey: @(aCountType),
+                                                      CountKey: @(aCount)};
+}
+
+- (id)have:(NSUInteger)aCount {
+    NSDictionary *userInfo = [self userInfoForHaveMatcherWithCountType:KWCountTypeExact count:aCount];
+    return [KWInvocationCapturer invocationCapturerWithDelegate:[KWHaveMatcher class] userInfo:userInfo];
+}
+
+- (id)haveAtLeast:(NSUInteger)aCount {
+    NSDictionary *userInfo = [self userInfoForHaveMatcherWithCountType:KWCountTypeAtLeast count:aCount];
+    return [KWInvocationCapturer invocationCapturerWithDelegate:[KWHaveMatcher class] userInfo:userInfo];
+}
+
+- (id)haveAtMost:(NSUInteger)aCount {
+    NSDictionary *userInfo = [self userInfoForHaveMatcherWithCountType:KWCountTypeAtMost count:aCount];
+    return [KWInvocationCapturer invocationCapturerWithDelegate:[KWHaveMatcher class] userInfo:userInfo];
+}
+
+@end
Pods/Kiwi/Classes/KWHaveValueMatcher.h
@@ -0,0 +1,28 @@
+//
+//  KWHaveValueMatcher.h
+//  Kiwi
+//
+//  Created by Luke Redpath on 24/01/2011.
+//  Copyright 2011 Allen Ding. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+#import "KWMatcher.h"
+
+@interface KWHaveValueMatcher : KWMatcher {
+@private
+
+  NSString *expectedKey;
+  NSString *expectedKeyPath;
+  id expectedValue;
+}
+
+#pragma mark -
+#pragma mark Configuring Matchers
+
+- (void)haveValue:(id)value forKey:(NSString *)key;
+- (void)haveValue:(id)value forKeyPath:(NSString *)keyPath;
+- (void)haveValueForKey:(NSString *)key;
+- (void)haveValueForKeyPath:(NSString *)keyPath;
+
+@end
Pods/Kiwi/Classes/KWHaveValueMatcher.m
@@ -0,0 +1,152 @@
+//
+//  KWHaveValueMatcher.m
+//  Kiwi
+//
+//  Created by Luke Redpath on 24/01/2011.
+//  Copyright 2011 Allen Ding. All rights reserved.
+//
+
+#import "KWHaveValueMatcher.h"
+#import "KWGenericMatchingAdditions.h"
+#import "KWGenericMatcher.h"
+#import "KWFormatter.h"
+
+@interface KWHaveValueMatcher()
+
+#pragma mark -
+#pragma mark Properties
+
+@property (nonatomic, retain) NSString *expectedKey;
+@property (nonatomic, retain) NSString *expectedKeyPath;
+@property (nonatomic, retain) id expectedValue;
+
+- (id)subjectValue;
+
+@end
+
+@implementation KWHaveValueMatcher
+
+@synthesize expectedKey, expectedKeyPath, expectedValue;
+
+- (void)dealloc
+{
+  [expectedKeyPath release];
+  [expectedKey release];
+  [expectedValue release];
+  [super dealloc];
+}
+
+#pragma mark -
+#pragma mark Getting Matcher Strings
+
++ (NSArray *)matcherStrings {
+  return @[@"haveValue:forKey:",
+          @"haveValueForKey:",
+          @"haveValue:forKeyPath:",
+          @"haveValueForKeyPath:"];
+}
+
+#pragma mark -
+#pragma mark Matching
+
+- (BOOL)evaluate {
+  BOOL matched = NO;
+
+  @try {
+    id value = [self subjectValue];
+
+    if (value) {
+      matched = YES;
+
+      if (self.expectedValue) {
+        matched = [self.expectedValue isEqualOrMatches:value];
+      }
+    }
+  }
+  @catch (NSException * e) {} // catch KVO non-existent key errors
+
+  return matched;
+}
+
+- (NSString *)failureMessageForShould {
+    if (self.expectedValue == nil) {
+        return [NSString stringWithFormat:@"expected subject to have a value for key %@",
+                                          [KWFormatter formatObject:self.expectedKey]];
+    }
+    id subjectValue = [self subjectValue];
+    if (subjectValue) {
+        return [NSString stringWithFormat:@"expected subject to have value %@ for key %@, but it had value %@ instead",
+                                          [KWFormatter formatObject:self.expectedValue],
+                                          [KWFormatter formatObject:self.expectedKey],
+                                          [KWFormatter formatObject:subjectValue]];
+    } else {
+        return [NSString stringWithFormat:@"expected subject to have value %@ for key %@, but the key was not present",
+                                          [KWFormatter formatObject:self.expectedValue],
+                                          [KWFormatter formatObject:self.expectedKey]];
+    }
+}
+
+- (id)subjectValue
+{
+  id value = nil;
+
+  if (self.expectedKey) {
+    value = [self.subject valueForKey:self.expectedKey];
+  } else
+  if (self.expectedKeyPath) {
+    value = [self.subject valueForKeyPath:self.expectedKeyPath];
+  }
+  return value;
+}
+
+- (NSString *)description
+{
+  NSString *keyDescription = nil;
+
+  if (self.expectedKey) {
+    keyDescription = [NSString stringWithFormat:@"key %@", [KWFormatter formatObject:self.expectedKey]];
+  }
+  else {
+    keyDescription = [NSString stringWithFormat:@"keypath %@", [KWFormatter formatObject:self.expectedKeyPath]];
+  }
+
+  NSString *valueDescription = nil;
+
+  if (self.expectedValue) {
+    valueDescription = [NSString stringWithFormat:@"value %@", [KWFormatter formatObject:self.expectedValue]];
+  }
+  else {
+    valueDescription = @"value";
+  }
+
+  return [NSString stringWithFormat:@"have %@ for %@", valueDescription, keyDescription];
+}
+
+#pragma mark -
+#pragma mark Configuring Matchers
+
+- (void)haveValue:(id)value forKey:(NSString *)key;
+{
+    self.expectedKey = key;
+    self.expectedValue = value;
+}
+
+- (void)haveValue:(id)value forKeyPath:(NSString *)key;
+{
+    self.expectedKeyPath = key;
+    self.expectedValue = value;
+}
+
+- (void)haveValueForKey:(NSString *)key;
+{
+    self.expectedKey = key;
+    self.expectedValue = nil;
+}
+
+- (void)haveValueForKeyPath:(NSString *)keyPath;
+{
+    self.expectedKeyPath = keyPath;
+    self.expectedValue = nil;
+}
+
+@end
Pods/Kiwi/Classes/KWInequalityMatcher.h
@@ -0,0 +1,33 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+#import "KWMatcher.h"
+
+enum {
+    KWInequalityTypeLessThan,
+    KWInequalityTypeLessThanOrEqualTo,
+    KWInequalityTypeGreaterThan,
+    KWInequalityTypeGreaterThanOrEqualTo
+};
+
+typedef NSUInteger KWInequalityType;
+
+@interface KWInequalityMatcher : KWMatcher {
+@private
+    KWInequalityType inequalityType;
+    id otherValue;
+}
+
+#pragma mark -
+#pragma mark Configuring Matchers
+
+- (void)beLessThan:(id)aValue;
+- (void)beLessThanOrEqualTo:(id)aValue;
+- (void)beGreaterThan:(id)aValue;
+- (void)beGreaterThanOrEqualTo:(id)aValue;
+
+@end
Pods/Kiwi/Classes/KWInequalityMatcher.m
@@ -0,0 +1,122 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWInequalityMatcher.h"
+#import "KWFormatter.h"
+
+@interface KWInequalityMatcher()
+
+#pragma mark -
+#pragma mark Properties
+
+@property (nonatomic, readwrite) KWInequalityType inequalityType;
+@property (nonatomic, readwrite, retain) id otherValue;
+
+@end
+
+@implementation KWInequalityMatcher
+
+#pragma mark -
+#pragma mark Initializing
+
+- (void)dealloc {
+    [otherValue release];
+    [super dealloc];
+}
+
+#pragma mark -
+#pragma mark Properties
+
+@synthesize inequalityType;
+@synthesize otherValue;
+
+#pragma mark -
+#pragma mark Getting Matcher Strings
+
++ (NSArray *)matcherStrings {
+    return @[@"beLessThan:",
+                                     @"beLessThanOrEqualTo:",
+                                     @"beGreaterThan:",
+                                     @"beGreaterThanOrEqualTo:"];
+}
+
+#pragma mark -
+#pragma mark Matching
+
+- (BOOL)evaluate {
+    if (![self.subject respondsToSelector:@selector(compare:)])
+        [NSException raise:@"KWMatcherException" format:@"subject does not respond to -compare:"];
+
+    NSComparisonResult result = [self.subject compare:self.otherValue];
+
+    switch (result) {
+        case NSOrderedSame:
+            return self.inequalityType == KWInequalityTypeLessThanOrEqualTo || self.inequalityType == KWInequalityTypeGreaterThanOrEqualTo;
+        case NSOrderedAscending:
+            return self.inequalityType == KWInequalityTypeLessThan || self.inequalityType == KWInequalityTypeLessThanOrEqualTo;
+        case NSOrderedDescending:
+            return self.inequalityType == KWInequalityTypeGreaterThan || self.inequalityType == KWInequalityTypeGreaterThanOrEqualTo;
+    }
+
+    assert(0 && "should never reach here");
+    return NO;
+}
+
+#pragma mark -
+#pragma mark Getting Failure Messages
+
+- (NSString *)comparisonPhrase {
+    switch (self.inequalityType) {
+        case KWInequalityTypeLessThan:
+            return @"<";
+        case KWInequalityTypeLessThanOrEqualTo:
+            return @"<=";
+        case KWInequalityTypeGreaterThan:
+            return @">";
+        case KWInequalityTypeGreaterThanOrEqualTo:
+            return @">=";
+    }
+
+    assert(0 && "should never reach here");
+    return nil;
+}
+
+- (NSString *)failureMessageForShould {
+    return [NSString stringWithFormat:@"expected subject to be %@ %@, got %@",
+                                      [self comparisonPhrase],
+                                      [KWFormatter formatObject:self.otherValue],
+                                      [KWFormatter formatObject:self.subject]];
+}
+
+- (NSString *)description
+{
+  return [NSString stringWithFormat:@"be %@ %@", [self comparisonPhrase], [KWFormatter formatObject:self.otherValue]];
+}
+
+#pragma mark -
+#pragma mark Configuring Matchers
+
+- (void)beLessThan:(id)aValue {
+    self.inequalityType = KWInequalityTypeLessThan;
+    self.otherValue = aValue;
+}
+
+- (void)beLessThanOrEqualTo:(id)aValue {
+    self.inequalityType = KWInequalityTypeLessThanOrEqualTo;
+    self.otherValue = aValue;
+}
+
+- (void)beGreaterThan:(id)aValue {
+    self.inequalityType = KWInequalityTypeGreaterThan;
+    self.otherValue = aValue;
+}
+
+- (void)beGreaterThanOrEqualTo:(id)aValue {
+    self.inequalityType = KWInequalityTypeGreaterThanOrEqualTo;
+    self.otherValue = aValue;
+}
+
+@end
Pods/Kiwi/Classes/KWIntercept.h
@@ -0,0 +1,50 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+#import <objc/runtime.h>
+
+@class KWMessagePattern;
+@class KWStub;
+
+#pragma mark -
+#pragma mark Getting Forwarding Implementations
+
+IMP KWRegularForwardingImplementation(void);
+IMP KWStretForwardingImplementation(void);
+IMP KWForwardingImplementationForMethodEncoding(const char* encoding);
+
+#pragma mark -
+#pragma mark Getting Intercept Class Information
+
+BOOL KWObjectIsClass(id anObject);
+BOOL KWClassIsInterceptClass(Class aClass);
+NSString *KWInterceptClassNameForClass(Class aClass);
+Class KWInterceptClassForCanonicalClass(Class canonicalClass);
+Class KWRealClassForClass(Class aClass);
+
+#pragma mark -
+#pragma mark Enabling Intercepting
+
+Class KWSetupObjectInterceptSupport(id anObject);
+void KWSetupMethodInterceptSupport(Class interceptClass, SEL aSelector);
+
+#pragma mark - Managing Stubs & Spies
+void KWClearStubsAndSpies(void);
+
+#pragma mark -
+#pragma mark Managing Objects Stubs
+
+void KWAssociateObjectStub(id anObject, KWStub *aStub, BOOL overrideExisting);
+void KWClearObjectStubs(id anObject);
+void KWClearAllObjectStubs(void);
+
+#pragma mark -
+#pragma mark Managing Message Spies
+
+void KWAssociateMessageSpy(id anObject, id aSpy, KWMessagePattern *aMessagePattern);
+void KWClearObjectSpy(id anObject, id aSpy, KWMessagePattern *aMessagePattern);
+void KWClearAllMessageSpies(void);
Pods/Kiwi/Classes/KWIntercept.m
@@ -0,0 +1,336 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWIntercept.h"
+#import "KWMessagePattern.h"
+#import "KWMessageSpying.h"
+#import "KWStub.h"
+
+static const char * const KWInterceptClassSuffix = "_KWIntercept";
+static NSMutableDictionary *KWObjectStubs = nil;
+static NSMutableDictionary *KWMessageSpies = nil;
+static NSMutableArray *KWRestoredObjects = nil;
+
+#pragma mark -
+#pragma mark Intercept Enabled Method Implementations
+
+Class KWRestoreOriginalClass(id anObject);
+void KWInterceptedForwardInvocation(id anObject, SEL aSelector, NSInvocation* anInvocation);
+void KWInterceptedDealloc(id anObject, SEL aSelector);
+Class KWInterceptedClass(id anObject, SEL aSelector);
+Class KWInterceptedSuperclass(id anObject, SEL aSelector);
+
+#pragma mark -
+#pragma mark Getting Forwarding Implementations
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wundeclared-selector"
+
+IMP KWRegularForwardingImplementation(void) {
+    return class_getMethodImplementation([NSObject class], @selector(KWNonExistantSelector));
+}
+
+IMP KWStretForwardingImplementation(void) {
+    return class_getMethodImplementation_stret([NSObject class], @selector(KWNonExistantSelector));
+}
+
+#pragma clang diagnostic pop
+
+IMP KWForwardingImplementationForMethodEncoding(const char* encoding) {
+#if TARGET_CPU_ARM
+    const NSUInteger stretLengthThreshold = 4;
+#elif TARGET_CPU_X86
+    const NSUInteger stretLengthThreshold = 8;
+#else
+    // TODO: This just makes an assumption right now. Expand to support all
+    // official architectures correctly.
+    const NSUInteger stretLengthThreshold = 8;
+#endif // #if TARGET_CPU_ARM
+
+    NSMethodSignature *signature = [NSMethodSignature signatureWithObjCTypes:encoding];
+
+    if (*[signature methodReturnType] == '{' && [signature methodReturnLength] > stretLengthThreshold) {
+        NSLog(@"Warning: The Objective-C runtime appears to have bugs when forwarding messages with certain struct layouts as return types, so if a crash occurs this could be the culprit");
+        return KWStretForwardingImplementation();
+    } else {
+        return KWRegularForwardingImplementation();
+    }
+}
+
+#pragma mark -
+#pragma mark Getting Intercept Class Information
+
+BOOL KWObjectIsClass(id anObject) {
+    return class_isMetaClass(object_getClass(anObject));
+}
+
+BOOL KWClassIsInterceptClass(Class aClass) {
+    const char *name = class_getName(aClass);
+    char *result = strstr(name, KWInterceptClassSuffix);
+    return result != nil;
+}
+
+int interceptCount = 0;
+
+NSString *KWInterceptClassNameForClass(Class aClass) {
+    const char *className = class_getName(aClass);
+    interceptCount++;
+    return [NSString stringWithFormat:@"%s%s%d", className, KWInterceptClassSuffix, interceptCount];
+}
+
+Class KWInterceptClassForCanonicalClass(Class canonicalClass) {
+    NSString *interceptClassName = KWInterceptClassNameForClass(canonicalClass);
+    Class interceptClass = NSClassFromString(interceptClassName);
+
+    if (interceptClass != nil)
+        return interceptClass;
+
+    interceptClass = objc_allocateClassPair(canonicalClass, [interceptClassName UTF8String], 0);
+    objc_registerClassPair(interceptClass);
+
+    class_addMethod(interceptClass, @selector(forwardInvocation:), (IMP)KWInterceptedForwardInvocation, "v@:@");
+    class_addMethod(interceptClass, @selector(dealloc), (IMP)KWInterceptedDealloc, "v@:");
+    class_addMethod(interceptClass, @selector(class), (IMP)KWInterceptedClass, "#@:");
+    class_addMethod(interceptClass, @selector(superclass), (IMP)KWInterceptedSuperclass, "#@:");
+
+    Class interceptMetaClass = object_getClass(interceptClass);
+    class_addMethod(interceptMetaClass, @selector(forwardInvocation:), (IMP)KWInterceptedForwardInvocation, "v@:@");
+
+    return interceptClass;
+}
+
+Class KWRealClassForClass(Class aClass) {
+    if (KWClassIsInterceptClass(aClass))
+        return [aClass superclass];
+
+    return aClass;
+}
+
+#pragma mark -
+#pragma mark Enabling Intercepting
+
+static BOOL IsTollFreeBridged(Class class, id obj)
+{
+    // this is a naive check, but good enough for the purposes of failing fast
+    return [NSStringFromClass(class) hasPrefix:@"NSCF"];
+}
+
+// Canonical class is the non-intercept, non-metaclass, class for an object.
+//
+// (e.g. [Animal class] would be canonical, not
+// object_getClass([Animal class]), if the Animal class has not been touched
+// by the intercept mechanism.
+
+Class KWSetupObjectInterceptSupport(id anObject) {
+    Class objectClass = object_getClass(anObject);
+
+    if (IsTollFreeBridged(objectClass, anObject)) {
+        [NSException raise:@"KWTollFreeBridgingInterceptException" format:@"Attempted to stub object of class %@. Kiwi does not support setting expectation or stubbing methods on toll-free bridged objects.", NSStringFromClass(objectClass)];
+    }
+
+    if (KWClassIsInterceptClass(objectClass))
+        return objectClass;
+
+    BOOL objectIsClass = KWObjectIsClass(anObject);
+    Class canonicalClass =  objectIsClass ? anObject : objectClass;
+    Class canonicalInterceptClass = KWInterceptClassForCanonicalClass(canonicalClass);
+    Class interceptClass = objectIsClass ? object_getClass(canonicalInterceptClass) : canonicalInterceptClass;
+
+    object_setClass(anObject, interceptClass);
+
+    return interceptClass;
+}
+
+void KWSetupMethodInterceptSupport(Class interceptClass, SEL aSelector) {
+    BOOL isMetaClass = class_isMetaClass(interceptClass);
+    Method method = isMetaClass ? class_getClassMethod(interceptClass, aSelector)
+                                : class_getInstanceMethod(interceptClass, aSelector);
+
+    if (method == nil) {
+        [NSException raise:NSInvalidArgumentException format:@"cannot setup intercept support for -%@ because no such method exists",
+                                                             NSStringFromSelector(aSelector)];
+    }
+
+    const char *encoding = method_getTypeEncoding(method);
+    IMP forwardingImplementation = KWForwardingImplementationForMethodEncoding(encoding);
+    class_addMethod(interceptClass, aSelector, forwardingImplementation, encoding);
+}
+
+#pragma mark -
+#pragma mark Intercept Enabled Method Implementations
+
+Class KWRestoreOriginalClass(id anObject) {
+    Class interceptClass = object_getClass(anObject);
+    if (KWClassIsInterceptClass(interceptClass))
+    {
+        Class originalClass = class_getSuperclass(interceptClass);
+        // anObject->isa = originalClass;
+        object_setClass(anObject, originalClass);
+    }
+    return interceptClass;
+}
+
+void KWInterceptedForwardInvocation(id anObject, SEL aSelector, NSInvocation* anInvocation) {
+    NSValue *key = [NSValue valueWithNonretainedObject:anObject];
+    NSMutableDictionary *spyArrayDictionary = KWMessageSpies[key];
+
+    for (KWMessagePattern *messagePattern in spyArrayDictionary) {
+        if ([messagePattern matchesInvocation:anInvocation]) {
+            NSArray *spies = spyArrayDictionary[messagePattern];
+
+            for (NSValue *spyWrapper in spies) {
+                id<KWMessageSpying> spy = [spyWrapper nonretainedObjectValue];
+                [spy object:anObject didReceiveInvocation:anInvocation];
+            }
+        }
+    }
+
+    NSMutableArray *stubs = KWObjectStubs[key];
+
+    for (KWStub *stub in stubs) {
+        if ([stub processInvocation:anInvocation])
+            return;
+    }
+
+    Class interceptClass = KWRestoreOriginalClass(anObject);
+    [anInvocation invoke];
+    // anObject->isa = interceptClass;
+    object_setClass(anObject, interceptClass);
+}
+
+void KWInterceptedDealloc(id anObject, SEL aSelector) {
+    NSValue *key = [NSValue valueWithNonretainedObject:anObject];
+    [KWMessageSpies removeObjectForKey:key];
+    [KWObjectStubs removeObjectForKey:key];
+
+    KWRestoreOriginalClass(anObject);
+    [anObject dealloc];
+}
+
+Class KWInterceptedClass(id anObject, SEL aSelector) {
+    Class interceptClass = object_getClass(anObject);
+    Class originalClass = class_getSuperclass(interceptClass);
+    return originalClass;
+}
+
+Class KWInterceptedSuperclass(id anObject, SEL aSelector) {
+    Class interceptClass = object_getClass(anObject);
+    Class originalClass = class_getSuperclass(interceptClass);
+    Class originalSuperclass = class_getSuperclass(originalClass);
+    return originalSuperclass;
+}
+
+#pragma mark - Managing Stubs & Spies
+
+void KWClearStubsAndSpies(void) {
+    KWRestoredObjects = [NSMutableArray array];
+    KWClearAllMessageSpies();
+    KWClearAllObjectStubs();
+    KWRestoredObjects = nil;
+}
+
+#pragma mark -
+#pragma mark Managing Objects Stubs
+
+void KWAssociateObjectStub(id anObject, KWStub *aStub, BOOL overrideExisting) {
+    if (KWObjectStubs == nil)
+        KWObjectStubs = [[NSMutableDictionary alloc] init];
+
+    NSValue *key = [NSValue valueWithNonretainedObject:anObject];
+    NSMutableArray *stubs = KWObjectStubs[key];
+
+    if (stubs == nil) {
+        stubs = [[NSMutableArray alloc] init];
+        KWObjectStubs[key] = stubs;
+        [stubs release];
+    }
+
+    NSUInteger stubCount = [stubs count];
+
+    for (NSUInteger i = 0; i < stubCount; ++i) {
+        KWStub *existingStub = stubs[i];
+
+        if ([aStub.messagePattern isEqualToMessagePattern:existingStub.messagePattern]) {
+            if (overrideExisting) {
+                [stubs removeObjectAtIndex:i];
+                break;
+            } else {
+                return;
+            }
+        }
+    }
+
+    [stubs addObject:aStub];
+}
+
+void KWClearObjectStubs(id anObject) {
+    NSValue *key = [NSValue valueWithNonretainedObject:anObject];
+    [KWObjectStubs removeObjectForKey:key];
+}
+
+void KWClearAllObjectStubs(void) {
+    for (NSValue *objectKey in KWObjectStubs) {
+        id stubbedObject = [objectKey nonretainedObjectValue];
+        if ([KWRestoredObjects containsObject:stubbedObject]) {
+            continue;
+        }
+        KWRestoreOriginalClass(stubbedObject);
+        [KWRestoredObjects addObject:stubbedObject];
+    }
+    [KWObjectStubs removeAllObjects];
+}
+
+#pragma mark -
+#pragma mark Managing Message Spies
+
+void KWAssociateMessageSpy(id anObject, id aSpy, KWMessagePattern *aMessagePattern) {
+    if (KWMessageSpies == nil)
+        KWMessageSpies = [[NSMutableDictionary alloc] init];
+
+    NSValue *key = [NSValue valueWithNonretainedObject:anObject];
+    NSMutableDictionary *spies = KWMessageSpies[key];
+
+    if (spies == nil) {
+        spies = [[NSMutableDictionary alloc] init];
+        KWMessageSpies[key] = spies;
+        [spies release];
+    }
+
+    NSMutableArray *messagePatternSpies = spies[aMessagePattern];
+
+    if (messagePatternSpies == nil) {
+        messagePatternSpies = [[NSMutableArray alloc] init];
+        spies[aMessagePattern] = messagePatternSpies;
+        [messagePatternSpies release];
+    }
+
+    NSValue *spyWrapper = [NSValue valueWithNonretainedObject:aSpy];
+
+    if ([messagePatternSpies containsObject:spyWrapper])
+        return;
+
+    [messagePatternSpies addObject:spyWrapper];
+}
+
+void KWClearObjectSpy(id anObject, id aSpy, KWMessagePattern *aMessagePattern) {
+    NSValue *key = [NSValue valueWithNonretainedObject:anObject];
+    NSMutableDictionary *spyArrayDictionary = KWMessageSpies[key];
+    NSMutableArray *spies = spyArrayDictionary[aMessagePattern];
+    NSValue *spyWrapper = [NSValue valueWithNonretainedObject:aSpy];
+    [spies removeObject:spyWrapper];
+}
+
+void KWClearAllMessageSpies(void) {
+    for (NSValue *objectKey in KWMessageSpies) {
+        id spiedObject = [objectKey nonretainedObjectValue];
+        if ([KWRestoredObjects containsObject:spiedObject]) {
+            continue;
+        }
+        KWRestoreOriginalClass(spiedObject);
+        [KWRestoredObjects addObject:spiedObject];
+    }
+    [KWMessageSpies removeAllObjects];
+}
Pods/Kiwi/Classes/KWInvocationCapturer.h
@@ -0,0 +1,42 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+
+@protocol KWInvocationCapturerDelegate;
+
+@interface KWInvocationCapturer : NSProxy {
+@private
+    id delegate;
+    NSDictionary *userInfo;
+}
+
+#pragma mark -
+#pragma mark Initializing
+
+- (id)initWithDelegate:(id)aDelegate;
+- (id)initWithDelegate:(id)aDelegate userInfo:(NSDictionary *)aUserInfo;
+
++ (id)invocationCapturerWithDelegate:(id)aDelegate;
++ (id)invocationCapturerWithDelegate:(id)aDelegate userInfo:(NSDictionary *)aUserInfo;
+
+#pragma mark -
+#pragma mark Properties
+
+@property (nonatomic, readonly) id delegate;
+@property (nonatomic, readonly) NSDictionary *userInfo;
+
+@end
+
+@protocol KWInvocationCapturerDelegate
+
+#pragma mark -
+#pragma mark Capturing Invocations
+
+- (NSMethodSignature *)invocationCapturer:(KWInvocationCapturer *)anInvocationCapturer methodSignatureForSelector:(SEL)aSelector;
+- (void)invocationCapturer:(KWInvocationCapturer *)anInvocationCapturer didCaptureInvocation:(NSInvocation *)anInvocation;
+
+@end
Pods/Kiwi/Classes/KWInvocationCapturer.m
@@ -0,0 +1,97 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWInvocationCapturer.h"
+#import "KWWorkarounds.h"
+#import "NSInvocation+KiwiAdditions.h"
+
+@implementation KWInvocationCapturer
+
+#pragma mark -
+#pragma mark Initializing
+
+- (id)initWithDelegate:(id)aDelegate {
+    return [self initWithDelegate:aDelegate userInfo:nil];
+}
+
+- (id)initWithDelegate:(id)aDelegate userInfo:(NSDictionary *)aUserInfo {
+    delegate = aDelegate;
+    userInfo = [aUserInfo retain];
+    return self;
+}
+
++ (id)invocationCapturerWithDelegate:(id)aDelegate {
+    return [self invocationCapturerWithDelegate:aDelegate userInfo:nil];
+}
+
++ (id)invocationCapturerWithDelegate:(id)aDelegate userInfo:(NSDictionary *)aUserInfo {
+    return [[[self alloc] initWithDelegate:aDelegate userInfo:aUserInfo] autorelease];
+}
+
+- (void)dealloc {
+    [userInfo release];
+    [super dealloc];
+}
+
+#pragma mark -
+#pragma mark Properties
+
+@synthesize delegate;
+@synthesize userInfo;
+
+#pragma mark -
+#pragma mark Capturing Invocations
+
+- (void)KW_captureInvocation:(NSInvocation *)anInvocation {
+    [self.delegate invocationCapturer:self didCaptureInvocation:anInvocation];
+}
+
+#pragma mark -
+#pragma mark Handling Invocations
+
+- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {
+    return [self.delegate invocationCapturer:self methodSignatureForSelector:aSelector];
+}
+
+- (void)forwardInvocation:(NSInvocation *)anInvocation {
+#if KW_TARGET_HAS_INVOCATION_EXCEPTION_BUG
+    @try {
+#endif // #if KW_TARGET_HAS_INVOCATION_EXCEPTION_BUG
+
+    [self KW_captureInvocation:anInvocation];
+
+#if KW_TARGET_HAS_INVOCATION_EXCEPTION_BUG
+    } @catch (NSException *exception) {
+        KWSetExceptionFromAcrossInvocationBoundary(exception);
+    }
+#endif // #if KW_TARGET_HAS_INVOCATION_EXCEPTION_BUG
+}
+
+#pragma mark -
+#pragma mark Whitelisted NSObject Methods
+
+// The return values from these methods should never be needed, so just call
+// the super implementation after capturing the invocation.
+
+- (BOOL)isEqual:(id)anObject {
+    NSInvocation *invocation = [NSInvocation invocationWithTarget:self selector:_cmd messageArguments:&anObject];
+    [self KW_captureInvocation:invocation];
+    return [super isEqual:anObject];
+}
+
+- (NSUInteger)hash {
+    NSInvocation *invocation = [NSInvocation invocationWithTarget:self selector:_cmd];
+    [self KW_captureInvocation:invocation];
+    return [super hash];
+}
+
+- (NSString *)description {
+    NSInvocation *invocation = [NSInvocation invocationWithTarget:self selector:_cmd];
+    [self KW_captureInvocation:invocation];
+    return [super description];
+}
+
+@end
Pods/Kiwi/Classes/KWItNode.h
@@ -0,0 +1,28 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+#import "KWBlockNode.h"
+#import "KWExampleNode.h"
+
+@class KWPendingNode;
+@class KWExample;
+@class KWContextNode;
+
+@interface KWItNode : KWBlockNode<KWExampleNode>
+
+@property (nonatomic, assign) KWExample *example;
+@property (nonatomic, retain, readonly) KWContextNode *context;
+
+#pragma mark -
+#pragma mark Initializing
+
++ (id)itNodeWithCallSite:(KWCallSite *)aCallSite 
+             description:(NSString *)aDescription 
+                 context:(KWContextNode *)context 
+                   block:(KWVoidBlock)aBlock;
+
+@end
Pods/Kiwi/Classes/KWItNode.m
@@ -0,0 +1,72 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWItNode.h"
+#import "KWExampleNodeVisitor.h"
+#import "KWExample.h"
+#import "KWVerifying.h"
+#import "KWContextNode.h"
+
+@interface KWItNode ()
+
+@property (nonatomic, retain, readwrite) KWContextNode *context;
+
+@end
+
+@implementation KWItNode
+
+@synthesize context = _context;
+@synthesize example;
+
+#pragma mark -
+#pragma mark Initializing
+
++ (id)itNodeWithCallSite:(KWCallSite *)aCallSite 
+             description:(NSString *)aDescription 
+                 context:(KWContextNode *)context 
+                   block:(KWVoidBlock)aBlock;
+{
+    KWItNode *itNode = [[self alloc] initWithCallSite:aCallSite description:aDescription block:aBlock];
+    itNode.context = context;
+    return [itNode autorelease];
+}
+
+#pragma mark -
+#pragma mark Accepting Visitors
+
+- (void)acceptExampleNodeVisitor:(id<KWExampleNodeVisitor>)aVisitor {
+    [aVisitor visitItNode:self];
+}
+
+#pragma mark -
+#pragma mark Runtime Description support
+
+- (NSString *)description
+{
+  NSString *description = [super description];
+  if (description == nil) {
+    description = [self.example generateDescriptionForAnonymousItNode];
+  }
+  return description;
+}
+
+#pragma mark -
+#pragma mark - Accessing the context stack
+
+- (NSArray *)contextStack
+{
+  NSMutableArray *contextStack = [NSMutableArray array];
+  
+  KWContextNode *currentContext = _context;
+  
+  while (currentContext) {
+    [contextStack addObject:currentContext];
+    currentContext = currentContext.parentContext;
+  }
+  return contextStack;
+}
+
+@end
Pods/Kiwi/Classes/KWMatcher.h
@@ -0,0 +1,48 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+#import "KWMatching.h"
+
+@interface KWMatcher : NSObject<KWMatching> {
+@protected
+    id subject;
+}
+
+#pragma mark -
+#pragma mark Initializing
+
+- (id)initWithSubject:(id)anObject;
+
++ (id)matcherWithSubject:(id)anObject;
+
+#pragma mark -
+#pragma mark Properties
+
+@property (nonatomic, readonly) id subject;
+
+#pragma mark -
+#pragma mark Getting Matcher Strings
+
++ (NSArray *)matcherStrings;
+
+#pragma mark -
+#pragma mark Getting Matcher Compatability
+
++ (BOOL)canMatchSubject:(id)anObject;
+
+#pragma mark -
+#pragma mark Matching
+
+- (BOOL)evaluate;
+
+#pragma mark -
+#pragma mark Getting Failure Messages
+
+- (NSString *)failureMessageForShould;
+- (NSString *)failureMessageForShouldNot;
+
+@end
Pods/Kiwi/Classes/KWMatcher.m
@@ -0,0 +1,91 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWMatcher.h"
+#import "KWFormatter.h"
+#import "KWFutureObject.h"
+
+@implementation KWMatcher
+
+#pragma mark -
+#pragma mark Initializing
+
+- (id)initWithSubject:(id)anObject {
+    if ((self = [super init])) {
+        subject = [anObject retain];
+    }
+
+    return self;
+}
+
++ (id)matcherWithSubject:(id)anObject {
+    return [[[self alloc] initWithSubject:anObject] autorelease];
+}
+
+- (void)dealloc {
+    [subject release];
+    [super dealloc];
+}
+
+#pragma mark -
+#pragma mark Properties
+
+@synthesize subject;
+
+- (id)subject
+{
+  if ([subject isKindOfClass:[KWFutureObject class]]) {
+    return [(KWFutureObject *)subject object];
+  }
+  return subject;
+}
+
+#pragma mark -
+#pragma mark Getting Matcher Strings
+
++ (NSArray *)matcherStrings {
+    return nil;
+}
+
+#pragma mark -
+#pragma mark Getting Matcher Compatability
+
++ (BOOL)canMatchSubject:(id)anObject {
+    return YES;
+}
+
+#pragma mark -
+#pragma mark Matching
+
+- (BOOL)evaluate {
+    [NSException raise:NSInternalInconsistencyException format:@"%@ must override -evaluate",
+                                                               [KWFormatter formatObject:[self class]]];
+    return NO;
+}
+
+#pragma mark -
+#pragma mark Getting Failure Messages
+
+- (NSString *)failureMessageForShould {
+    return @"subject did not meet expectation";
+}
+
+- (NSString *)failureMessageForShouldNot {
+    NSString *failureMessageForShould = [self failureMessageForShould];
+    NSRange markerRange = [failureMessageForShould rangeOfString:@" to "];
+
+    if (markerRange.location == NSNotFound)
+        return @"subject did not meet expectation";
+
+    NSRange replacementRange = NSMakeRange(0, markerRange.location + markerRange.length);
+    NSString *message = [failureMessageForShould stringByReplacingOccurrencesOfString:@" to "
+                                                                        withString:@" not to "
+                                                                           options:0
+                                                                             range:replacementRange];
+    return message;
+}
+
+@end
Pods/Kiwi/Classes/KWMatcherFactory.h
@@ -0,0 +1,51 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+#import "KWMatching.h"
+
+@class KWFailure;
+@class KWMatcher;
+@class KWUserDefinedMatcherBuilder;
+
+@interface KWMatcherFactory : NSObject {
+@private
+    NSMutableArray *registeredMatcherClasses;
+    NSMutableDictionary *matcherClassChains;
+}
+
+#pragma mark -
+#pragma mark Initializing
+
+- (id)init;
+
+#pragma mark -
+#pragma mark Properties
+
+@property (nonatomic, readonly) NSArray *registeredMatcherClasses;
+
+#pragma mark -
+#pragma mark Registering Matcher Classes
+
+- (void)registerMatcherClass:(Class)aClass;
+- (void)registerMatcherClassesWithNamespacePrefix:(NSString *)aNamespacePrefix;
+
+#pragma mark -
+#pragma mark Registering User Defined Matchers
+
+//- (void)registerUserDefinedMatcherWithBuilder:(KWUserDefinedMatcherBuilder *)aBuilder;
+
+#pragma mark -
+#pragma mark Getting Method Signatures
+
+- (NSMethodSignature *)methodSignatureForMatcherSelector:(SEL)aSelector;
+
+#pragma mark -
+#pragma mark Getting Matchers
+
+- (KWMatcher *)matcherFromInvocation:(NSInvocation *)anInvocation subject:(id)subject;
+
+@end
Pods/Kiwi/Classes/KWMatcherFactory.m
@@ -0,0 +1,155 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWMatcherFactory.h"
+#import <objc/runtime.h>
+#import "KWMatching.h"
+#import "KWStringUtilities.h"
+#import "KWUserDefinedMatcher.h"
+#import "KWMatchers.h"
+
+@interface KWMatcherFactory()
+- (Class)matcherClassForSelector:(SEL)aSelector subject:(id)anObject;
+@end
+
+@implementation KWMatcherFactory
+
+#pragma mark -
+#pragma mark Initializing
+
+- (id)init {
+    if ((self = [super init])) {
+        matcherClassChains = [[NSMutableDictionary alloc] init];
+        registeredMatcherClasses = [[NSMutableArray alloc] init];
+    }
+
+    return self;
+}
+
+- (void)dealloc {
+    [registeredMatcherClasses release];
+    [matcherClassChains release];
+    [super dealloc];
+}
+
+#pragma mark -
+#pragma mark Properties
+
+@synthesize registeredMatcherClasses;
+
+#pragma mark -
+#pragma mark Registering Matcher Classes
+
+- (void)registerMatcherClass:(Class)aClass {
+    if ([self.registeredMatcherClasses containsObject:aClass])
+        return;
+
+    [registeredMatcherClasses addObject:aClass];
+
+    for (NSString *verificationSelectorString in [aClass matcherStrings]) {
+        NSMutableArray *matcherClassChain = matcherClassChains[verificationSelectorString];
+
+        if (matcherClassChain == nil) {
+            matcherClassChain = [[NSMutableArray alloc] init];
+            matcherClassChains[verificationSelectorString] = matcherClassChain;
+            [matcherClassChain release];
+        }
+
+        [matcherClassChain removeObject:aClass];
+        [matcherClassChain insertObject:aClass atIndex:0];
+    }
+}
+
+- (void)registerMatcherClassesWithNamespacePrefix:(NSString *)aNamespacePrefix {
+    static NSMutableArray *matcherClasses = nil;
+
+    // Cache all classes that conform to KWMatching.
+    if (matcherClasses == nil) {
+        matcherClasses = [[NSMutableArray alloc] init];
+        int numberOfClasses = objc_getClassList(NULL, 0);
+        Class *classes = malloc(sizeof(Class) * numberOfClasses);
+        numberOfClasses = objc_getClassList(classes, numberOfClasses);
+
+        if (numberOfClasses == 0) {
+            free(classes);
+            return;
+        }
+
+        for (int i = 0; i < numberOfClasses; ++i) {
+            Class candidateClass = classes[i];
+
+            if (!class_respondsToSelector(candidateClass, @selector(conformsToProtocol:)))
+                continue;
+
+            if (![candidateClass conformsToProtocol:@protocol(KWMatching)])
+                continue;
+
+            [matcherClasses addObject:candidateClass];
+        }
+
+        free(classes);
+    }
+
+    for (Class matcherClass in matcherClasses) {
+        NSString *className = NSStringFromClass(matcherClass);
+
+        if (KWStringHasStrictWordPrefix(className, aNamespacePrefix))
+            [self registerMatcherClass:matcherClass];
+    }
+}
+
+#pragma mark -
+#pragma mark Registering User Defined Matchers
+
+//- (void)registerUserDefinedMatcherWithBuilder:(KWUserDefinedMatcherBuilder *)aBuilder
+//{
+//
+//}
+
+#pragma mark -
+#pragma mark Getting Method Signatures
+
+- (NSMethodSignature *)methodSignatureForMatcherSelector:(SEL)aSelector {
+    NSMutableArray *matcherClassChain = matcherClassChains[NSStringFromSelector(aSelector)];
+
+    if ([matcherClassChain count] == 0)
+        return nil;
+
+    Class matcherClass = matcherClassChain[0];
+    return [matcherClass instanceMethodSignatureForSelector:aSelector];
+}
+
+#pragma mark -
+#pragma mark Getting Matchers
+
+- (KWMatcher *)matcherFromInvocation:(NSInvocation *)anInvocation subject:(id)subject {
+    SEL selector = [anInvocation selector];
+
+    // try and match a built-in or registered matcher class
+    Class matcherClass = [self matcherClassForSelector:selector subject:subject];
+
+    if (matcherClass == nil) {
+        // see if we can match with a user-defined matcher instead
+        return [[KWMatchers matchers] matcherForSelector:selector subject:subject];
+    }
+    return [[[matcherClass alloc] initWithSubject:subject] autorelease];
+}
+
+#pragma mark -
+#pragma mark Private methods
+
+- (Class)matcherClassForSelector:(SEL)aSelector subject:(id)anObject {
+    NSArray *matcherClassChain = matcherClassChains[NSStringFromSelector(aSelector)];
+
+    for (Class matcherClass in matcherClassChain) {
+        if ([matcherClass canMatchSubject:anObject])
+            return matcherClass;
+    }
+
+    return nil;
+}
+
+@end
Pods/Kiwi/Classes/KWMatchers.h
@@ -0,0 +1,35 @@
+//
+//  KWMatchers.h
+//  Kiwi
+//
+//  Created by Luke Redpath on 17/06/2011.
+//  Copyright 2011 Allen Ding. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+@class KWUserDefinedMatcherBuilder;
+
+typedef void (^KWMatchersBuildingBlock)(KWUserDefinedMatcherBuilder *);
+
+@class KWUserDefinedMatcher;
+
+@interface KWMatchers : NSObject {
+  NSMutableDictionary *userDefinedMatchers;
+}
++ (id)matchers;
+
+#pragma mark -
+#pragma mark Defining Matchers
+
++ (void)defineMatcher:(NSString *)selectorString as:(KWMatchersBuildingBlock)block;
+- (void)defineMatcher:(NSString *)selectorString as:(KWMatchersBuildingBlock)block;
+- (void)addUserDefinedMatcherBuilder:(KWUserDefinedMatcherBuilder *)builder;
+
+#pragma mark -
+#pragma mark Building Matchers
+
+- (KWUserDefinedMatcher *)matcherForSelector:(SEL)selector subject:(id)subject;
+@end
+
+void KWDefineMatchers(NSString *selectorString, KWMatchersBuildingBlock block);
Pods/Kiwi/Classes/KWMatchers.m
@@ -0,0 +1,72 @@
+//
+//  KWMatchers.m
+//  Kiwi
+//
+//  Created by Luke Redpath on 17/06/2011.
+//  Copyright 2011 Allen Ding. All rights reserved.
+//
+
+#import "KWMatchers.h"
+#import "KWUserDefinedMatcher.h"
+
+@implementation KWMatchers
+
+#pragma mark -
+#pragma mark Singleton implementation
+
+static id sharedMatchers = nil;
+
++ (void)initialize {
+  if (self == [KWMatchers class]) {
+    sharedMatchers = [[self alloc] init];
+  }
+}
+
++ (id)matchers {
+  return sharedMatchers;
+}
+
+- (id)init {
+    if ((self = [super init])) {
+        userDefinedMatchers = [[NSMutableDictionary alloc] init];
+    }
+    return self;
+}
+
+#pragma mark -
+#pragma mark Defining Matchers
+
++ (void)defineMatcher:(NSString *)selectorString as:(KWMatchersBuildingBlock)block {
+    [[self matchers] defineMatcher:selectorString as:block];
+}
+
+- (void)defineMatcher:(NSString *)selectorString as:(KWMatchersBuildingBlock)block {
+    KWUserDefinedMatcherBuilder *builder = [KWUserDefinedMatcherBuilder builderForSelector:NSSelectorFromString(selectorString)];
+    block(builder);
+    userDefinedMatchers[builder.key] = builder;
+}
+
+- (void)addUserDefinedMatcherBuilder:(KWUserDefinedMatcherBuilder *)builder {
+    userDefinedMatchers[builder.key] = builder;
+}
+
+#pragma mark -
+#pragma mark Building Matchers
+
+- (KWUserDefinedMatcher *)matcherForSelector:(SEL)selector subject:(id)subject {
+    KWUserDefinedMatcherBuilder *builder = userDefinedMatchers[NSStringFromSelector(selector)];
+
+    if (builder == nil)
+        return nil;
+
+    return [builder buildMatcherWithSubject:subject];
+}
+
+
+@end
+
+void KWDefineMatchers(NSString *selectorString, KWMatchersBuildingBlock block)
+{
+    [KWMatchers defineMatcher:selectorString as:block];
+}
+
Pods/Kiwi/Classes/KWMatching.h
@@ -0,0 +1,45 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+
+@protocol KWMatching<NSObject>
+
+#pragma mark -
+#pragma mark Initializing
+
+- (id)initWithSubject:(id)anObject;
+
+#pragma mark -
+#pragma mark Getting Matcher Strings
+
++ (NSArray *)matcherStrings;
+
+#pragma mark -
+#pragma mark Getting Matcher Compatability
+
++ (BOOL)canMatchSubject:(id)anObject;
+
+#pragma mark -
+#pragma mark Matching
+
+@optional
+
+- (BOOL)shouldBeEvaluatedAtEndOfExample;
+- (BOOL)willEvaluateMultipleTimes;
+- (void)setWillEvaluateMultipleTimes:(BOOL)shouldEvaluateMultipleTimes;
+
+@required
+
+- (BOOL)evaluate;
+
+#pragma mark -
+#pragma mark Getting Failure Messages
+
+- (NSString *)failureMessageForShould;
+- (NSString *)failureMessageForShouldNot;
+
+@end
Pods/Kiwi/Classes/KWMatchVerifier.h
@@ -0,0 +1,45 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+#import "KWExpectationType.h"
+#import "KWVerifying.h"
+
+@class KWCallSite;
+@class KWMatcherFactory;
+
+@protocol KWMatching;
+@protocol KWReporting;
+
+@interface KWMatchVerifier : NSObject<KWVerifying> {
+@private
+    KWExpectationType expectationType;
+    KWCallSite *callSite;
+    KWMatcherFactory *matcherFactory;
+    id<KWReporting> reporter;
+    id subject;
+    id<KWMatching> endOfExampleMatcher;
+}
+
+#pragma mark -
+#pragma mark Properties
+
+@property (nonatomic, readonly) KWExpectationType expectationType;
+@property (nonatomic, readonly) KWCallSite *callSite;
+@property (nonatomic, readonly) KWMatcherFactory *matcherFactory;
+@property (nonatomic, readonly) id<KWReporting> reporter;
+@property (nonatomic, readwrite, retain) id subject;
+
+#pragma mark -
+#pragma mark Initializing
+
+- (id)initForShouldWithCallSite:(KWCallSite *)aCallSite matcherFactory:(KWMatcherFactory *)aMatcherFactory reporter:(id<KWReporting>)aReporter;
+- (id)initForShouldNotWithCallSite:(KWCallSite *)aCallSite matcherFactory:(KWMatcherFactory *)aMatcherFactory reporter:(id<KWReporting>)aReporter;
+- (id)initWithExpectationType:(KWExpectationType)anExpectationType callSite:(KWCallSite *)aCallSite matcherFactory:(KWMatcherFactory *)aMatcherFactory reporter:(id<KWReporting>)aReporter;
+
++ (id)matchVerifierWithExpectationType:(KWExpectationType)anExpectationType callSite:(KWCallSite *)aCallSite matcherFactory:(KWMatcherFactory *)aMatcherFactory reporter:(id<KWReporting>)aReporter;
+
+@end
Pods/Kiwi/Classes/KWMatchVerifier.m
@@ -0,0 +1,181 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWMatchVerifier.h"
+#import "KWFailure.h"
+#import "KWFormatter.h"
+#import "KWInvocationCapturer.h"
+#import "KWMatcherFactory.h"
+#import "KWReporting.h"
+#import "KWStringUtilities.h"
+#import "KWWorkarounds.h"
+#import "NSInvocation+KiwiAdditions.h"
+#import "NSMethodSignature+KiwiAdditions.h"
+
+@interface KWMatchVerifier()
+
+#pragma mark -
+#pragma mark Properties
+
+@property (nonatomic, readwrite, retain) id<KWMatching> endOfExampleMatcher;
+@property (nonatomic, readwrite, retain) id<KWMatching> matcher;
+
+@end
+
+@implementation KWMatchVerifier
+
+@synthesize matcher;
+
+#pragma mark -
+#pragma mark Initializing
+
+- (id)initForShouldWithCallSite:(KWCallSite *)aCallSite matcherFactory:(KWMatcherFactory *)aMatcherFactory reporter:(id<KWReporting>)aReporter {
+    return [self initWithExpectationType:KWExpectationTypeShould callSite:aCallSite matcherFactory:aMatcherFactory reporter:aReporter];
+}
+
+- (id)initForShouldNotWithCallSite:(KWCallSite *)aCallSite matcherFactory:(KWMatcherFactory *)aMatcherFactory reporter:(id<KWReporting>)aReporter {
+    return [self initWithExpectationType:KWExpectationTypeShouldNot callSite:aCallSite matcherFactory:aMatcherFactory reporter:aReporter];
+}
+
+- (id)initWithExpectationType:(KWExpectationType)anExpectationType callSite:(KWCallSite *)aCallSite matcherFactory:(KWMatcherFactory *)aMatcherFactory reporter:(id<KWReporting>)aReporter {
+    if ((self = [super init])) {
+        expectationType = anExpectationType;
+        callSite = [aCallSite retain];
+        matcherFactory = aMatcherFactory;
+        reporter = aReporter;
+    }
+
+    return self;
+}
+
++ (id)matchVerifierWithExpectationType:(KWExpectationType)anExpectationType callSite:(KWCallSite *)aCallSite matcherFactory:(KWMatcherFactory *)aMatcherFactory reporter:(id<KWReporting>)aReporter {
+    return [[[self alloc] initWithExpectationType:anExpectationType callSite:aCallSite matcherFactory:aMatcherFactory reporter:aReporter] autorelease];
+}
+
+- (void)dealloc {
+    [subject release];
+    [callSite release];
+    [matcher release];
+    [endOfExampleMatcher release];
+    [super dealloc];
+}
+
+- (NSString *)descriptionForAnonymousItNode
+{
+  NSString *typeString = @"";
+
+  switch (self.expectationType) {
+    case KWExpectationTypeShould:
+      typeString = @"should";
+      break;
+    case KWExpectationTypeShouldNot:
+      typeString = @"should not";
+  }
+  id<KWMatching> actualMatcher = (self.endOfExampleMatcher == nil) ? self.matcher : self.endOfExampleMatcher;
+  return [NSString stringWithFormat:@"%@ %@", typeString, actualMatcher];
+}
+
+#pragma mark -
+#pragma mark Properties
+
+@synthesize expectationType;
+@synthesize callSite;
+@synthesize matcherFactory;
+@synthesize reporter;
+@synthesize subject;
+@synthesize endOfExampleMatcher;
+
+#pragma mark -
+#pragma mark Verifying
+
+- (void)verifyWithMatcher:(id<KWMatching>)aMatcher {
+    @try {
+        BOOL matchResult = [aMatcher evaluate];
+
+        if (self.expectationType == KWExpectationTypeShould && !matchResult) {
+            NSString *message = [aMatcher failureMessageForShould];
+            KWFailure *failure = [KWFailure failureWithCallSite:self.callSite message:message];
+            [self.reporter reportFailure:failure];
+        } else if (self.expectationType == KWExpectationTypeShouldNot && matchResult) {
+            NSString *message = [aMatcher failureMessageForShouldNot];
+            KWFailure *failure = [KWFailure failureWithCallSite:self.callSite message:message];
+            [self.reporter reportFailure:failure];
+        }
+    } @catch (NSException *exception) {
+        KWFailure *failure = [KWFailure failureWithCallSite:self.callSite message:[exception description]];
+        [self.reporter reportFailure:failure];
+    }
+}
+
+#pragma mark -
+#pragma mark Ending Examples
+
+- (void)exampleWillEnd {
+    if (self.endOfExampleMatcher == nil)
+        return;
+
+    [self verifyWithMatcher:self.endOfExampleMatcher];
+}
+
+#pragma mark -
+#pragma mark Handling Invocations
+
+- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {
+    NSMethodSignature *signature = [super methodSignatureForSelector:aSelector];
+
+    if (signature != nil)
+        return signature;
+
+    signature = [self.matcherFactory methodSignatureForMatcherSelector:aSelector];
+
+    if (signature != nil)
+        return signature;
+
+    // Return a dummy method signature so that problems can be handled in
+    // -forwardInvocation:.
+    NSString *encoding = KWEncodingForVoidMethod();
+    return [NSMethodSignature signatureWithObjCTypes:[encoding UTF8String]];
+}
+
+- (void)forwardInvocation:(NSInvocation *)anInvocation {
+#if KW_TARGET_HAS_INVOCATION_EXCEPTION_BUG
+    @try {
+#endif // #if KW_TARGET_HAS_INVOCATION_EXCEPTION_BUG
+
+    self.matcher = (id<KWMatching>)[self.matcherFactory matcherFromInvocation:anInvocation subject:self.subject];
+
+    if (self.matcher == nil) {
+      KWFailure *failure = [KWFailure failureWithCallSite:self.callSite format:@"could not create matcher for -%@",
+                 NSStringFromSelector(anInvocation.selector)];
+      [self.reporter reportFailure:failure];
+    }
+    [anInvocation invokeWithTarget:self.matcher];
+
+#if KW_TARGET_HAS_INVOCATION_EXCEPTION_BUG
+    // A matcher might have set an exception within the -invokeWithTarget, so
+    // raise if one was set.
+    NSException *exception = KWGetAndClearExceptionFromAcrossInvocationBoundary();
+    [exception raise];
+#endif // #if KW_TARGET_HAS_INVOCATION_EXCEPTION_BUG
+
+    if ([self.matcher respondsToSelector:@selector(shouldBeEvaluatedAtEndOfExample)] && [self.matcher shouldBeEvaluatedAtEndOfExample]) {
+        self.endOfExampleMatcher = self.matcher;
+        self.matcher = nil;
+    }
+    else {
+        [self verifyWithMatcher:self.matcher];
+    }
+
+#if KW_TARGET_HAS_INVOCATION_EXCEPTION_BUG
+    } @catch (NSException *exception) {
+        KWFailure *failure = [KWFailure failureWithCallSite:self.callSite format:[exception reason]];
+        [self.reporter reportFailure:failure];
+        return;
+    }
+#endif // #if KW_TARGET_HAS_INVOCATION_EXCEPTION_BUG
+}
+
+@end
Pods/Kiwi/Classes/KWMessagePattern.h
@@ -0,0 +1,49 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+
+@interface KWMessagePattern : NSObject<NSCopying> {
+@private
+    SEL selector;
+    NSArray *argumentFilters;
+}
+
+#pragma mark -
+#pragma mark Initializing
+
+- (id)initWithSelector:(SEL)aSelector;
+- (id)initWithSelector:(SEL)aSelector argumentFilters:(NSArray *)anArray;
+- (id)initWithSelector:(SEL)aSelector firstArgumentFilter:(id)firstArgumentFilter argumentList:(va_list)argumentList;
+
++ (id)messagePatternWithSelector:(SEL)aSelector;
++ (id)messagePatternWithSelector:(SEL)aSelector argumentFilters:(NSArray *)anArray;
++ (id)messagePatternWithSelector:(SEL)aSelector firstArgumentFilter:(id)firstArgumentFilter argumentList:(va_list)argumentList;
+
++ (id)messagePatternFromInvocation:(NSInvocation *)anInvocation;
+
+#pragma mark -
+#pragma mark Properties
+
+@property (nonatomic, readonly) SEL selector;
+@property (nonatomic, readonly) NSArray *argumentFilters;
+
+#pragma mark -
+#pragma mark Matching Invocations
+
+- (BOOL)matchesInvocation:(NSInvocation *)anInvocation;
+
+#pragma mark -
+#pragma mark Comparing Message Patterns
+
+- (BOOL)isEqualToMessagePattern:(KWMessagePattern *)aMessagePattern;
+
+#pragma mark -
+#pragma mark Retrieving String Representations
+
+- (NSString *)stringValue;
+
+@end
Pods/Kiwi/Classes/KWMessagePattern.m
@@ -0,0 +1,231 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWMessagePattern.h"
+#import "KWFormatter.h"
+#import "KWNull.h"
+#import "KWObjCUtilities.h"
+#import "KWValue.h"
+#import "NSInvocation+KiwiAdditions.h"
+#import "NSMethodSignature+KiwiAdditions.h"
+#import "KWGenericMatchEvaluator.h"
+#import "Kiwi.h"
+
+@implementation KWMessagePattern
+
+#pragma mark -
+#pragma mark Initializing
+
+- (id)initWithSelector:(SEL)aSelector {
+    return [self initWithSelector:aSelector argumentFilters:nil];
+}
+
+- (id)initWithSelector:(SEL)aSelector argumentFilters:(NSArray *)anArray {
+    if ((self = [super init])) {
+        selector = aSelector;
+
+        if ([anArray count] > 0)
+            argumentFilters = [anArray copy];
+    }
+
+    return self;
+}
+
+- (id)initWithSelector:(SEL)aSelector firstArgumentFilter:(id)firstArgumentFilter argumentList:(va_list)argumentList {
+    NSUInteger count = KWSelectorParameterCount(aSelector);
+    NSMutableArray *array = [NSMutableArray arrayWithCapacity:count];
+    [array addObject:(firstArgumentFilter != nil) ? firstArgumentFilter : [KWNull null]];
+
+    for (NSUInteger i = 1; i < count; ++i)
+    {
+        id object = va_arg(argumentList, id);
+        [array addObject:(object != nil) ? object : [KWNull null]];
+    }
+
+    va_end(argumentList);
+    return [self initWithSelector:aSelector argumentFilters:array];
+}
+
++ (id)messagePatternWithSelector:(SEL)aSelector {
+    return [self messagePatternWithSelector:aSelector argumentFilters:nil];
+}
+
++ (id)messagePatternWithSelector:(SEL)aSelector argumentFilters:(NSArray *)anArray {
+    return [[[self alloc] initWithSelector:aSelector argumentFilters:anArray] autorelease];
+}
+
++ (id)messagePatternWithSelector:(SEL)aSelector firstArgumentFilter:(id)firstArgumentFilter argumentList:(va_list)argumentList {
+    return [[[self alloc] initWithSelector:aSelector firstArgumentFilter:firstArgumentFilter argumentList:argumentList] autorelease];
+}
+
++ (id)messagePatternFromInvocation:(NSInvocation *)anInvocation {
+    NSMethodSignature *signature = [anInvocation methodSignature];
+    NSUInteger numberOfMessageArguments = [signature numberOfMessageArguments];
+    NSMutableArray *argumentFilters = nil;
+
+    if (numberOfMessageArguments > 0) {
+        argumentFilters = [[NSMutableArray alloc] initWithCapacity:numberOfMessageArguments];
+
+        for (NSUInteger i = 0; i < numberOfMessageArguments; ++i) {
+            const char *type = [signature messageArgumentTypeAtIndex:i];
+            id object = nil;
+
+            if (KWObjCTypeIsObject(type)) {
+                [anInvocation getMessageArgument:&object atIndex:i];
+            } else {
+                NSData *data = [anInvocation messageArgumentDataAtIndex:i];
+                object = [KWValue valueWithBytes:[data bytes] objCType:type];
+            }
+
+			
+			if (strcmp(type, "@?") == 0) object = [[object copy] autorelease]; // Converting NSStackBlock to NSMallocBlock
+            [argumentFilters addObject:(object != nil) ? object : [KWNull null]];
+        }
+    }
+
+    return [self messagePatternWithSelector:[anInvocation selector] argumentFilters:[argumentFilters autorelease]];
+}
+
+- (void)dealloc {
+    [argumentFilters release];
+    [super dealloc];
+}
+
+#pragma mark -
+#pragma mark Copying
+
+- (id)copyWithZone:(NSZone *)zone {
+    return [self retain];
+}
+
+#pragma mark -
+#pragma mark Properties
+
+@synthesize selector;
+@synthesize argumentFilters;
+
+#pragma mark -
+#pragma mark Matching Invocations
+
+- (BOOL)argumentFiltersMatchInvocationArguments:(NSInvocation *)anInvocation {
+    if (self.argumentFilters == nil)
+        return YES;
+
+    NSMethodSignature *signature = [anInvocation methodSignature];
+    NSUInteger numberOfArgumentFilters = [self.argumentFilters count];
+    NSUInteger numberOfMessageArguments = [signature numberOfMessageArguments];
+
+    for (NSUInteger i = 0; i < numberOfMessageArguments && i < numberOfArgumentFilters; ++i) {
+        const char *objCType = [signature messageArgumentTypeAtIndex:i];
+        id object = nil;
+
+        // Extract message argument into object (wrapping values if neccesary)
+        if (KWObjCTypeIsObject(objCType)) {
+            [anInvocation getMessageArgument:&object atIndex:i];
+        } else {
+            NSData *data = [anInvocation messageArgumentDataAtIndex:i];
+            object = [KWValue valueWithBytes:[data bytes] objCType:objCType];
+        }
+
+        // Match argument filter to object
+        id argumentFilter = (self.argumentFilters)[i];
+
+        if ([argumentFilter isEqual:[KWAny any]]) {
+            continue;
+        }
+
+        if ([KWGenericMatchEvaluator isGenericMatcher:argumentFilter]) {
+            id matcher = argumentFilter;
+            if ([object isKindOfClass:[KWValue class]] && [object isNumeric]) {
+                NSNumber *number = [object numberValue];
+                if (![KWGenericMatchEvaluator genericMatcher:matcher matches:number]) {
+                    return NO;
+                }
+            } else if (![KWGenericMatchEvaluator genericMatcher:matcher matches:object]) {
+                return NO;
+            }
+        } else if ([argumentFilter isEqual:[KWNull null]]) {
+            if (!KWObjCTypeIsPointerLike(objCType)) {
+                [NSException raise:@"KWMessagePatternException" format:@"nil was specified as an argument filter, but argument(%d) is not a pointer for @selector(%@)", (int)(i + 1), NSStringFromSelector([anInvocation selector])];
+            }
+            void *p = nil;
+            [anInvocation getMessageArgument:&p atIndex:i];
+            if (p != nil)
+                return NO;
+        } else if (![argumentFilter isEqual:object]) {
+            return NO;
+        }
+    }
+
+    return YES;
+}
+
+- (BOOL)matchesInvocation:(NSInvocation *)anInvocation {
+    return self.selector == [anInvocation selector] && [self argumentFiltersMatchInvocationArguments:anInvocation];
+}
+
+#pragma mark -
+#pragma mark Comparing Message Patterns
+
+- (NSUInteger)hash {
+    return [NSStringFromSelector(self.selector) hash];
+}
+
+- (BOOL)isEqual:(id)object {
+    if (![object isKindOfClass:[KWMessagePattern class]])
+        return NO;
+
+    return [self isEqualToMessagePattern:object];
+}
+
+- (BOOL)isEqualToMessagePattern:(KWMessagePattern *)aMessagePattern {
+    if (self.selector != aMessagePattern.selector)
+        return NO;
+
+    if (self.argumentFilters == nil && aMessagePattern.argumentFilters == nil)
+        return YES;
+
+    return [self.argumentFilters isEqualToArray:aMessagePattern.argumentFilters];
+}
+
+#pragma mark -
+#pragma mark Retrieving String Representations
+
+- (NSString *)selectorString {
+    return NSStringFromSelector(self.selector);
+}
+
+- (NSString *)selectorAndArgumentFiltersString {
+    NSMutableString *description = [[[NSMutableString alloc] init] autorelease];
+    NSArray *components = [NSStringFromSelector(self.selector) componentsSeparatedByString:@":"];
+    NSUInteger count = [components count] - 1;
+
+    for (NSUInteger i = 0; i < count; ++i) {
+        NSString *selectorComponent = components[i];
+        NSString *argumentFilterString = [KWFormatter formatObject:(self.argumentFilters)[i]];
+        [description appendFormat:@"%@:%@ ", selectorComponent, argumentFilterString];
+    }
+
+    return description;
+}
+
+- (NSString *)stringValue {
+    if (self.argumentFilters == nil)
+        return [self selectorString];
+    else
+        return [self selectorAndArgumentFiltersString];
+}
+
+#pragma mark -
+#pragma mark Debugging
+
+- (NSString *)description {
+    return [NSString stringWithFormat:@"selector: %@\nargumentFilters: %@",
+                                      NSStringFromSelector(self.selector),
+                                      self.argumentFilters];
+}
+
+@end
Pods/Kiwi/Classes/KWMessageSpying.h
@@ -0,0 +1,16 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+
+@protocol KWMessageSpying<NSObject>
+
+#pragma mark -
+#pragma mark Spying on Messages
+
+- (void)object:(id)anObject didReceiveInvocation:(NSInvocation *)anInvocation;
+
+@end
Pods/Kiwi/Classes/KWMessageTracker.h
@@ -0,0 +1,53 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+#import "KWCountType.h"
+#import "KWMessageSpying.h"
+
+@class KWMessagePattern;
+
+@interface KWMessageTracker : NSObject<KWMessageSpying> {
+@private
+    id subject;
+    KWMessagePattern *messagePattern;
+    KWCountType countType;
+    NSUInteger count;
+    NSUInteger receivedCount;
+}
+
+#pragma mark -
+#pragma mark Initializing
+
+- (id)initWithSubject:(id)anObject messagePattern:(KWMessagePattern *)aMessagePattern countType:(KWCountType)aCountType count:(NSUInteger)aCount;
+
++ (id)messageTrackerWithSubject:(id)anObject messagePattern:(KWMessagePattern *)aMessagePattern countType:(KWCountType)aCountType count:(NSUInteger)aCount;
+
+#pragma mark -
+#pragma mark Properties
+
+@property (nonatomic, readonly) id subject;
+@property (nonatomic, readonly) KWMessagePattern *messagePattern;
+@property (nonatomic, readonly) KWCountType countType;
+@property (nonatomic, readonly) NSUInteger count;
+
+#pragma mark -
+#pragma mark Stopping Tracking
+
+- (void)stopTracking;
+
+#pragma mark -
+#pragma mark Getting Message Tracker Status
+
+- (BOOL)succeeded;
+
+#pragma mark -
+#pragma mark Getting Phrases
+
+- (NSString *)expectedCountPhrase;
+- (NSString *)receivedCountPhrase;
+
+@end
Pods/Kiwi/Classes/KWMessageTracker.m
@@ -0,0 +1,151 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWMessageTracker.h"
+#import "KWMessagePattern.h"
+#import "NSObject+KiwiStubAdditions.h"
+
+@interface KWMessageTracker()
+
+#pragma mark -
+#pragma mark Properties
+
+@property (nonatomic, readwrite) NSUInteger receivedCount;
+
+@end
+
+@implementation KWMessageTracker
+
+#pragma mark -
+#pragma mark Initializing
+
+- (id)initWithSubject:(id)anObject messagePattern:(KWMessagePattern *)aMessagePattern countType:(KWCountType)aCountType count:(NSUInteger)aCount {
+    if ((self = [super init])) {
+        subject = [anObject retain];
+        messagePattern = [aMessagePattern retain];
+        countType = aCountType;
+        count = aCount;
+        [anObject addMessageSpy:self forMessagePattern:messagePattern];
+    }
+
+    return self;
+}
+
++ (id)messageTrackerWithSubject:(id)anObject messagePattern:(KWMessagePattern *)aMessagePattern countType:(KWCountType)aCountType count:(NSUInteger)aCount {
+    return [[[self alloc] initWithSubject:anObject messagePattern:aMessagePattern countType:aCountType count:aCount] autorelease];
+}
+
+- (void)dealloc {
+    [subject release];
+    [messagePattern release];
+    [super dealloc];
+}
+
+#pragma mark -
+#pragma mark Properties
+
+@synthesize subject;
+@synthesize messagePattern;
+@synthesize countType;
+@synthesize count;
+@synthesize receivedCount;
+
+#pragma mark -
+#pragma mark Spying on Messages
+
+- (void)object:(id)anObject didReceiveInvocation:(NSInvocation *)anInvocation {
+    if (![self.messagePattern matchesInvocation:anInvocation])
+        return;
+
+    ++self.receivedCount;
+}
+
+#pragma mark -
+#pragma mark Stopping Tracking
+
+- (void)stopTracking {
+    [self.subject removeMessageSpy:self forMessagePattern:self.messagePattern];
+}
+
+#pragma mark -
+#pragma mark Getting Message Tracker Status
+
+- (BOOL)succeeded {
+    switch (self.countType) {
+        case KWCountTypeExact:
+            return self.receivedCount == self.count;
+        case KWCountTypeAtLeast:
+            return self.receivedCount >= self.count;
+        case KWCountTypeAtMost:
+            return self.receivedCount <= self.count;
+        default:
+            break;
+    }
+
+    assert(0 && "should never reach here");
+    return NO;
+}
+
+#pragma mark -
+#pragma mark Getting Phrases
+
+- (NSString *)phraseForCount:(NSUInteger)aCount {
+    if (aCount == 1)
+        return @"1 time";
+
+    return [NSString stringWithFormat:@"%d times", (int)aCount];
+}
+
+- (NSString *)expectedCountPhrase {
+    NSString *countPhrase = [self phraseForCount:self.count];
+
+    switch (self.countType) {
+        case KWCountTypeExact:
+            return [NSString stringWithFormat:@"exactly %@", countPhrase];
+        case KWCountTypeAtLeast:
+            return [NSString stringWithFormat:@"at least %@", countPhrase];
+        case KWCountTypeAtMost:
+            return [NSString stringWithFormat:@"at most %@", countPhrase];
+        default:
+            break;
+    }
+
+    assert(0 && "should never reach here");
+    return nil;
+}
+
+- (NSString *)receivedCountPhrase {
+    return [self phraseForCount:self.receivedCount];
+}
+
+#pragma mark -
+#pragma mark Debugging
+
+- (NSString *)modeString {
+    switch (self.countType) {
+        case KWCountTypeExact:
+            return @"KWCountTypeExact";
+        case KWCountTypeAtLeast:
+            return @"KWCountTypeAtLeast";
+        case KWCountTypeAtMost:
+            return @"KWCountTypeAtMost";
+        default:
+            break;
+    }
+
+    assert(0 && "should never reach here");
+    return nil;
+}
+
+- (NSString *)description {
+    return [NSString stringWithFormat:@"messagePattern: %@\nmode: %@\ncount: %d\nreceiveCount: %d",
+                                      self.messagePattern,
+                                      self.modeString,
+                                      (int)self.count,
+                                      (int)self.receivedCount];
+}
+
+@end
Pods/Kiwi/Classes/KWMock.h
@@ -0,0 +1,103 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+#import "KWInvocationCapturer.h"
+
+@class KWMessagePattern;
+@class KWCaptureSpy;
+
+@protocol KWMessageSpying;
+@protocol KWVerifying;
+
+@interface KWMock : NSObject {
+@private
+    BOOL isPartialMock;
+    BOOL isNullMock;
+    NSString *mockName;
+    id mockedObject;
+    Class mockedClass;
+    Protocol *mockedProtocol;
+    NSMutableArray *stubs;
+    NSMutableArray *expectedMessagePatterns;
+    NSMutableDictionary *messageSpies;
+}
+
+#pragma mark -
+#pragma mark Initializing
+
+- (id)initForClass:(Class)aClass;
+- (id)initForProtocol:(Protocol *)aProtocol;
+- (id)initWithName:(NSString *)aName forClass:(Class)aClass;
+- (id)initWithName:(NSString *)aName forProtocol:(Protocol *)aProtocol;
+
+- (id)initAsNullMockForClass:(Class)aClass;
+- (id)initAsNullMockForProtocol:(Protocol *)aProtocol;
+- (id)initAsNullMockWithName:(NSString *)aName forClass:(Class)aClass;
+- (id)initAsNullMockWithName:(NSString *)aName forProtocol:(Protocol *)aProtocol;
+
+- (id)initAsPartialMockForObject:(id)object;
+- (id)initAsPartialMockWithName:(NSString *)aName forObject:(id)object;
+
++ (id)mockForClass:(Class)aClass;
++ (id)mockForProtocol:(Protocol *)aProtocol;
++ (id)mockWithName:(NSString *)aName forClass:(Class)aClass;
++ (id)mockWithName:(NSString *)aName forProtocol:(Protocol *)aProtocol;
+
++ (id)nullMockForClass:(Class)aClass;
++ (id)nullMockForProtocol:(Protocol *)aProtocol;
++ (id)nullMockWithName:(NSString *)aName forClass:(Class)aClass ;
++ (id)nullMockWithName:(NSString *)aName forProtocol:(Protocol *)aProtocol;
+
++ (id)partialMockForObject:(id)object;
++ (id)partialMockWithName:(NSString *)aName forObject:(id)object;
+
+#pragma mark -
+#pragma mark Properties
+
+@property (nonatomic, readonly) BOOL isNullMock;
+@property (nonatomic, readonly) BOOL isPartialMock;
+@property (nonatomic, readonly) NSString *mockName;
+@property (nonatomic, readonly) Class mockedClass;
+@property (nonatomic, readonly) id mockedObject;
+@property (nonatomic, readonly) Protocol *mockedProtocol;
+
+#pragma mark -
+#pragma mark Stubbing Methods
+
+- (void)stub:(SEL)aSelector;
+- (void)stub:(SEL)aSelector withBlock:(id (^)(NSArray *params))block;
+- (void)stub:(SEL)aSelector withArguments:(id)firstArgument, ...;
+- (void)stub:(SEL)aSelector andReturn:(id)aValue;
+- (void)stub:(SEL)aSelector andReturn:(id)aValue withArguments:(id)firstArgument, ...;
+
+- (id)stub;
+- (id)stubAndReturn:(id)aValue;
+- (id)stubAndReturn:(id)aValue times:(id)times afterThatReturn:(id)aSecondValue;
+
+- (void)stubMessagePattern:(KWMessagePattern *)aMessagePattern andReturn:(id)aValue;
+- (void)stubMessagePattern:(KWMessagePattern *)aMessagePattern andReturn:(id)aValue times:(id)times afterThatReturn:(id)aSecondValue;
+
+- (void)clearStubs;
+
+#pragma mark -
+#pragma mark Spying on Messages
+
+- (void)addMessageSpy:(id<KWMessageSpying>)aSpy forMessagePattern:(KWMessagePattern *)aMessagePattern;
+- (void)removeMessageSpy:(id<KWMessageSpying>)aSpy forMessagePattern:(KWMessagePattern *)aMessagePattern;
+
+
+#pragma mark -
+#pragma mark Expecting Messages
+
+- (void)expect:(SEL)aSelector;
+- (void)expect:(SEL)aSelector withArguments:(id)firstArgument, ...;
+
+- (id)expect;
+
+- (void)expectMessagePattern:(KWMessagePattern *)aMessagePattern;
+
+@end
Pods/Kiwi/Classes/KWMock.m
@@ -0,0 +1,672 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWMock.h"
+#import <objc/runtime.h>
+#import "KWFormatter.h"
+#import "KWMessagePattern.h"
+#import "KWMessageSpying.h"
+#import "KWStringUtilities.h"
+#import "KWStub.h"
+#import "KWWorkarounds.h"
+#import "NSInvocation+KiwiAdditions.h"
+#import "KWCaptureSpy.h"
+
+static NSString * const ExpectOrStubTagKey = @"ExpectOrStubTagKey";
+static NSString * const StubTag = @"StubTag";
+static NSString * const ExpectTag = @"ExpectTag";
+static NSString * const StubValueKey = @"StubValueKey";
+static NSString * const StubSecondValueKey = @"StubSecondValueKey";
+static NSString * const ChangeStubValueAfterTimesKey = @"ChangeStubValueAfterTimesKey";
+
+@interface KWMock()
+
+#pragma mark -
+#pragma mark Initializing
+
+- (id)initAsNullMock:(BOOL)nullMockFlag withName:(NSString *)aName forClass:(Class)aClass protocol:(Protocol *)aProtocol;
+
+#pragma mark -
+#pragma mark Properties
+
+@property (nonatomic, readonly) NSMutableArray *stubs;
+@property (nonatomic, readonly) NSMutableArray *expectedMessagePatterns;
+@property (nonatomic, readonly) NSMutableDictionary *messageSpies;
+
+
+#pragma mark -
+#pragma mark Handling Invocations
+
+- (BOOL)processReceivedInvocation:(NSInvocation *)invocation;
+
+@end
+
+@implementation KWMock
+
+#pragma mark -
+#pragma mark Initializing
+
+- (id)init {
+    // May already have been initialized since stubbing -init is allowed!
+    if (self.stubs != nil) {
+        KWMessagePattern *messagePattern = [KWMessagePattern messagePatternWithSelector:_cmd];
+        [self expectMessagePattern:messagePattern];
+        NSInvocation *invocation = [NSInvocation invocationWithTarget:self selector:_cmd];
+
+        if ([self processReceivedInvocation:invocation]) {
+            id result = nil;
+            [invocation getReturnValue:&result];
+            return result;
+        } else {
+            return self;
+        }
+    }
+
+    return [self initAsNullMock:NO withName:nil forClass:nil protocol:nil];
+}
+
+- (id)initForClass:(Class)aClass {
+    return [self initAsNullMock:NO withName:nil forClass:aClass protocol:nil];
+}
+
+- (id)initForProtocol:(Protocol *)aProtocol {
+    return [self initAsNullMock:NO withName:nil forClass:nil protocol:aProtocol];
+}
+
+- (id)initWithName:(NSString *)aName forClass:(Class)aClass {
+    return [self initAsNullMock:NO withName:aName forClass:aClass protocol:nil];
+}
+
+- (id)initWithName:(NSString *)aName forProtocol:(Protocol *)aProtocol {
+    return [self initAsNullMock:NO withName:aName forClass:nil protocol:aProtocol];
+}
+
+- (id)initAsNullMockForClass:(Class)aClass {
+    return [self initAsNullMock:YES withName:nil forClass:aClass protocol:nil];
+}
+
+- (id)initAsNullMockForProtocol:(Protocol *)aProtocol {
+    return [self initAsNullMock:YES withName:nil forClass:nil protocol:aProtocol];
+}
+
+- (id)initAsNullMockWithName:(NSString *)aName forClass:(Class)aClass {
+    return [self initAsNullMock:YES withName:aName forClass:aClass protocol:nil];
+}
+
+- (id)initAsNullMockWithName:(NSString *)aName forProtocol:(Protocol *)aProtocol {
+    return [self initAsNullMock:YES withName:aName forClass:nil protocol:aProtocol];
+}
+
+- (id)initAsNullMock:(BOOL)nullMockFlag withName:(NSString *)aName forClass:(Class)aClass protocol:(Protocol *)aProtocol {
+    if ((self = [super init])) {
+        isNullMock = nullMockFlag;
+        mockName = [aName copy];
+        mockedClass = aClass;
+        mockedProtocol = aProtocol;
+        stubs = [[NSMutableArray alloc] init];
+        expectedMessagePatterns = [[NSMutableArray alloc] init];
+        messageSpies = [[NSMutableDictionary alloc] init];
+    }
+
+    return self;
+}
+
+- (id)initAsPartialMockForObject:(id)object {
+    return [self initAsPartialMockWithName:nil forObject:object];
+}
+
+- (id)initAsPartialMockWithName:(NSString *)aName forObject:(id)object {
+    if ((self = [self initAsNullMock:YES withName:aName forClass:[object class] protocol:nil])) {
+        isPartialMock = YES;
+        mockedObject = [object retain];
+    }
+    return self;
+}
+
++ (id)mockForClass:(Class)aClass {
+    return [[[self alloc] initForClass:aClass] autorelease];
+}
+
++ (id)mockForProtocol:(Protocol *)aProtocol {
+    return [[[self alloc] initForProtocol:aProtocol] autorelease];
+}
+
++ (id)mockWithName:(NSString *)aName forClass:(Class)aClass {
+    return [[[self alloc] initWithName:aName forClass:aClass] autorelease];
+}
+
++ (id)mockWithName:(NSString *)aName forProtocol:(Protocol *)aProtocol {
+    return [[[self alloc] initWithName:aName forProtocol:aProtocol] autorelease];
+}
+
++ (id)nullMockForClass:(Class)aClass {
+    return [[[self alloc] initAsNullMockForClass:aClass] autorelease];
+}
+
++ (id)nullMockForProtocol:(Protocol *)aProtocol {
+    return [[[self alloc] initAsNullMockForProtocol:aProtocol] autorelease];
+}
+
++ (id)nullMockWithName:(NSString *)aName forClass:(Class)aClass {
+    return [[[self alloc] initAsNullMockWithName:aName forClass:aClass] autorelease];
+}
+
++ (id)nullMockWithName:(NSString *)aName forProtocol:(Protocol *)aProtocol {
+    return [[[self alloc] initAsNullMockWithName:aName forProtocol:aProtocol] autorelease];
+}
+
++ (id)partialMockWithName:(NSString *)aName forObject:(id)object {
+    return [[[self alloc] initAsPartialMockWithName:aName forObject:object] autorelease];
+}
+
++ (id)partialMockForObject:(id)object {
+    return [[[self alloc] initAsPartialMockForObject:object] autorelease];
+}
+
+- (void)dealloc {
+    [mockedObject release];
+    [mockName release];
+    [stubs release];
+    [expectedMessagePatterns release];
+    [messageSpies release];
+    [super dealloc];
+}
+
+#pragma mark -
+#pragma mark Properties
+
+@synthesize isPartialMock;
+@synthesize isNullMock;
+@synthesize mockName;
+@synthesize mockedObject;
+@synthesize mockedClass;
+@synthesize mockedProtocol;
+@synthesize stubs;
+@synthesize expectedMessagePatterns;
+@synthesize messageSpies;
+
+#pragma mark -
+#pragma mark Getting Transitive Closure For Mocked Protocols
+
+- (NSSet *)mockedProtocolTransitiveClosureSet {
+    if (self.mockedProtocol == nil)
+        return nil;
+
+    NSMutableSet *protocolSet = [NSMutableSet set];
+    NSMutableArray *protocolQueue = [NSMutableArray array];
+    [protocolQueue addObject:self.mockedProtocol];
+
+    do {
+        Protocol *protocol = [protocolQueue lastObject];
+        [protocolSet addObject:protocol];
+        [protocolQueue removeLastObject];
+
+        unsigned int count = 0;
+        Protocol **protocols = (Protocol **)protocol_copyProtocolList(protocol, &count);
+
+        if (count == 0)
+            continue;
+
+        for (unsigned int i = 0; i < count; ++i)
+            [protocolQueue addObject:protocols[i]];
+
+        free(protocols);
+    } while ([protocolQueue count] != 0);
+
+    return protocolSet;
+}
+
+#pragma mark -
+#pragma mark Stubbing Methods
+
+- (void)removeStubWithMessagePattern:(KWMessagePattern *)messagePattern {
+    KWStub *stub = [self currentStubWithMessagePattern:messagePattern];
+    if (stub) {
+        [self.stubs removeObject:stub];
+    }
+}
+
+- (KWStub *)currentStubWithMessagePattern:(KWMessagePattern *)messagePattern {
+    NSUInteger stubCount = [self.stubs count];
+    
+    for (NSUInteger i = 0; i < stubCount; ++i) {
+        KWStub *stub = (self.stubs)[i];
+        
+        if ([stub.messagePattern isEqualToMessagePattern:messagePattern]) {
+            return stub;
+        }
+    }
+    return nil;
+}
+
+- (void)stub:(SEL)aSelector {
+    KWMessagePattern *messagePattern = [KWMessagePattern messagePatternWithSelector:aSelector];
+    [self stubMessagePattern:messagePattern andReturn:nil];
+}
+
+- (void)stub:(SEL)aSelector withBlock:(id (^)(NSArray *params))block {
+    KWMessagePattern *messagePattern = [KWMessagePattern messagePatternWithSelector:aSelector];
+    [self stubMessagePattern:messagePattern withBlock:block];
+}
+
+- (void)stub:(SEL)aSelector withArguments:(id)firstArgument, ... {
+    va_list argumentList;
+    va_start(argumentList, firstArgument);
+    KWMessagePattern *messagePattern = [KWMessagePattern messagePatternWithSelector:aSelector firstArgumentFilter:firstArgument argumentList:argumentList];
+    [self stubMessagePattern:messagePattern andReturn:nil];
+}
+
+- (void)stub:(SEL)aSelector andReturn:(id)aValue {
+    KWMessagePattern *messagePattern = [KWMessagePattern messagePatternWithSelector:aSelector];
+    [self stubMessagePattern:messagePattern andReturn:aValue];
+}
+
+- (void)stub:(SEL)aSelector andReturn:(id)aValue withArguments:(id)firstArgument, ... {
+    va_list argumentList;
+    va_start(argumentList, firstArgument);
+    KWMessagePattern *messagePattern = [KWMessagePattern messagePatternWithSelector:aSelector firstArgumentFilter:firstArgument argumentList:argumentList];
+    [self stubMessagePattern:messagePattern andReturn:aValue];
+}
+
+- (id)stub {
+    NSDictionary *userInfo = @{ExpectOrStubTagKey: StubTag};
+    return [KWInvocationCapturer invocationCapturerWithDelegate:self userInfo:userInfo];
+}
+
+- (id)stubAndReturn:(id)aValue {
+    NSDictionary *userInfo = @{ExpectOrStubTagKey: StubTag,
+                                                                        StubValueKey: aValue};
+    return [KWInvocationCapturer invocationCapturerWithDelegate:self userInfo:userInfo];
+}
+
+- (id)stubAndReturn:(id)aValue times:(id)times afterThatReturn:(id)aSecondValue {
+    NSDictionary *userInfo = @{ExpectOrStubTagKey: StubTag, StubValueKey: aValue, ChangeStubValueAfterTimesKey: times, StubSecondValueKey: aSecondValue};
+    return [KWInvocationCapturer invocationCapturerWithDelegate:self userInfo:userInfo];
+}
+
+- (void)stubMessagePattern:(KWMessagePattern *)aMessagePattern andReturn:(id)aValue {
+    [self stubMessagePattern:aMessagePattern andReturn:aValue overrideExisting:YES];
+}
+
+- (void)stubMessagePattern:(KWMessagePattern *)aMessagePattern andReturn:(id)aValue overrideExisting:(BOOL)overrideExisting {
+    [self expectMessagePattern:aMessagePattern];
+    KWStub *existingStub = [self currentStubWithMessagePattern:aMessagePattern];
+    if (existingStub) {
+        if (overrideExisting) {
+            [self.stubs removeObject:existingStub];
+        } else {
+            return;
+        }
+    }
+    KWStub *stub = [KWStub stubWithMessagePattern:aMessagePattern value:aValue];
+    [self.stubs addObject:stub];
+}
+
+- (void)stubMessagePattern:(KWMessagePattern *)aMessagePattern withBlock:(id (^)(NSArray *params))block {
+    [self expectMessagePattern:aMessagePattern];
+    [self removeStubWithMessagePattern:aMessagePattern];
+    KWStub *stub = [KWStub stubWithMessagePattern:aMessagePattern block:block];
+    [self.stubs addObject:stub];
+}
+
+- (void)stubMessagePattern:(KWMessagePattern *)aMessagePattern andReturn:(id)aValue times:(id)times afterThatReturn:(id)aSecondValue {   
+    [self expectMessagePattern:aMessagePattern];
+    [self removeStubWithMessagePattern:aMessagePattern];
+    KWStub *stub = [KWStub stubWithMessagePattern:aMessagePattern value:aValue times:times afterThatReturn:aSecondValue];
+    [self.stubs addObject:stub];
+}
+
+- (void)clearStubs {
+    [self.stubs removeAllObjects];
+}
+
+#pragma mark -
+#pragma mark Spying on Messages
+
+- (void)addMessageSpy:(id<KWMessageSpying>)aSpy forMessagePattern:(KWMessagePattern *)aMessagePattern {
+    [self expectMessagePattern:aMessagePattern];
+    NSMutableArray *messagePatternSpies = (self.messageSpies)[aMessagePattern];
+
+    if (messagePatternSpies == nil) {
+        messagePatternSpies = [[NSMutableArray alloc] init];
+        (self.messageSpies)[aMessagePattern] = messagePatternSpies;
+        [messagePatternSpies release];
+    }
+    NSValue *spyWrapper = [NSValue valueWithNonretainedObject:aSpy];
+
+    if (![messagePatternSpies containsObject:spyWrapper])
+        [messagePatternSpies addObject:spyWrapper];
+}
+
+- (void)removeMessageSpy:(id<KWMessageSpying>)aSpy forMessagePattern:(KWMessagePattern *)aMessagePattern {
+    NSValue *spyWrapper = [NSValue valueWithNonretainedObject:aSpy];
+    NSMutableArray *messagePatternSpies = (self.messageSpies)[aMessagePattern];
+    [messagePatternSpies removeObject:spyWrapper];
+}
+
+#pragma mark -
+#pragma mark Expecting Message Patterns
+
+- (void)expect:(SEL)aSelector {
+    KWMessagePattern *messagePattern = [KWMessagePattern messagePatternWithSelector:aSelector];
+    [self expectMessagePattern:messagePattern];
+}
+
+- (void)expect:(SEL)aSelector withArguments:(id)firstArgument, ... {
+    va_list argumentList;
+    va_start(argumentList, firstArgument);
+    KWMessagePattern *messagePattern = [KWMessagePattern messagePatternWithSelector:aSelector firstArgumentFilter:firstArgument argumentList:argumentList];
+    [self expectMessagePattern:messagePattern];
+}
+
+- (id)expect {
+    NSDictionary *userInfo = @{ExpectOrStubTagKey: ExpectTag};
+    return [KWInvocationCapturer invocationCapturerWithDelegate:self userInfo:userInfo];
+}
+
+- (void)expectMessagePattern:(KWMessagePattern *)aMessagePattern {
+    if (![self.expectedMessagePatterns containsObject:aMessagePattern])
+        [self.expectedMessagePatterns addObject:aMessagePattern];
+}
+
+#pragma mark -
+#pragma mark Capturing Invocations
+
+- (NSMethodSignature *)invocationCapturer:(KWInvocationCapturer *)anInvocationCapturer methodSignatureForSelector:(SEL)aSelector {
+    return [self methodSignatureForSelector:aSelector];
+}
+
+- (void)invocationCapturer:(KWInvocationCapturer *)anInvocationCapturer didCaptureInvocation:(NSInvocation *)anInvocation {
+    KWMessagePattern *messagePattern = [KWMessagePattern messagePatternFromInvocation:anInvocation];
+    NSString *tag = (anInvocationCapturer.userInfo)[ExpectOrStubTagKey];
+    if ([tag isEqualToString:StubTag]) {
+        id value = (anInvocationCapturer.userInfo)[StubValueKey];
+        if (!(anInvocationCapturer.userInfo)[StubSecondValueKey]) {
+            [self stubMessagePattern:messagePattern andReturn:value];
+        } else {
+            id times = (anInvocationCapturer.userInfo)[ChangeStubValueAfterTimesKey];
+            id secondValue = (anInvocationCapturer.userInfo)[StubSecondValueKey];
+            [self stubMessagePattern:messagePattern andReturn:value times:times afterThatReturn:secondValue];
+        }
+    } else {
+        [self expectMessagePattern:messagePattern];
+    }
+}
+
+#pragma mark -
+#pragma mark Handling Invocations
+
+- (NSString *)namePhrase {
+    if (self.mockName == nil)
+        return @"mock";
+    else
+        return [NSString stringWithFormat:@"mock \"%@\"", self.mockName];
+}
+
+- (BOOL)processReceivedInvocation:(NSInvocation *)invocation {
+    for (KWMessagePattern *messagePattern in self.messageSpies) {
+        if ([messagePattern matchesInvocation:invocation]) {
+            NSArray *spies = (self.messageSpies)[messagePattern];
+
+            for (NSValue *spyWrapper in spies) {
+                id spy = [spyWrapper nonretainedObjectValue];
+                [spy object:self didReceiveInvocation:invocation];
+            }
+        }
+    }
+
+    for (KWStub *stub in self.stubs) {
+        if ([stub processInvocation:invocation])
+            return YES;
+    }
+
+    return NO;
+}
+
+- (NSMethodSignature *)mockedProtocolMethodSignatureForSelector:(SEL)aSelector {
+    NSSet *protocols = [self mockedProtocolTransitiveClosureSet];
+
+    for (Protocol *protocol in protocols) {
+        struct objc_method_description description = protocol_getMethodDescription(protocol, aSelector, NO, YES);
+
+        if (description.types == nil)
+            description = protocol_getMethodDescription(protocol, aSelector, YES, YES);
+
+        if (description.types != nil)
+            return [NSMethodSignature signatureWithObjCTypes:description.types];
+    }
+
+    return nil;
+}
+
+- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {
+    NSMethodSignature *methodSignature = [self.mockedClass instanceMethodSignatureForSelector:aSelector];
+
+    if (methodSignature != nil)
+        return methodSignature;
+
+    methodSignature = [self mockedProtocolMethodSignatureForSelector:aSelector];
+
+    if (methodSignature != nil)
+        return methodSignature;
+
+    NSString *encoding = KWEncodingForVoidMethod();
+    return [NSMethodSignature signatureWithObjCTypes:[encoding UTF8String]];
+}
+
+- (void)forwardInvocation:(NSInvocation *)anInvocation {
+#if KW_TARGET_HAS_INVOCATION_EXCEPTION_BUG
+    @try {
+#endif // #if KW_TARGET_HAS_INVOCATION_EXCEPTION_BUG
+
+    if ([self processReceivedInvocation:anInvocation])
+        return;
+
+    if (isPartialMock)
+        [anInvocation invokeWithTarget:self.mockedObject];
+
+    if (self.isNullMock)
+        return;
+
+    for (KWMessagePattern *expectedMessagePattern in self.expectedMessagePatterns) {
+        if ([expectedMessagePattern matchesInvocation:anInvocation])
+            return;
+    }
+
+    KWMessagePattern *messagePattern = [KWMessagePattern messagePatternFromInvocation:anInvocation];
+    [NSException raise:@"KWMockException" format:@"%@ received unexpected message -%@",
+                                                 [self namePhrase],
+                                                 [messagePattern stringValue]];
+
+#if KW_TARGET_HAS_INVOCATION_EXCEPTION_BUG
+    } @catch (NSException *exception) {
+        KWSetExceptionFromAcrossInvocationBoundary(exception);
+    }
+#endif // #if KW_TARGET_HAS_INVOCATION_EXCEPTION_BUG
+}
+
+#pragma mark -
+#pragma mark Testing Objects
+
+- (BOOL)mockedClassHasAncestorClass:(Class)aClass {
+    Class currentClass = self.mockedClass;
+
+    while (currentClass != nil) {
+        if (currentClass == aClass)
+            return YES;
+
+        currentClass = [currentClass superclass];
+    }
+
+    return NO;
+}
+
+- (BOOL)mockedClassRespondsToSelector:(SEL)aSelector {
+    return [self.mockedClass instancesRespondToSelector:aSelector];
+}
+
+- (BOOL)mockedClassConformsToProtocol:(Protocol *)aProtocol {
+    return [self.mockedClass conformsToProtocol:aProtocol];
+}
+
+- (BOOL)mockedProtocolRespondsToSelector:(SEL)aSelector {
+    NSSet *protocols = [self mockedProtocolTransitiveClosureSet];
+
+    for (Protocol *protocol in protocols) {
+        struct objc_method_description description = protocol_getMethodDescription(protocol, aSelector, NO, YES);
+
+        if (description.types == nil)
+            description = protocol_getMethodDescription(protocol, aSelector, YES, YES);
+
+        if (description.types != nil)
+            return YES;
+    }
+
+    return NO;
+}
+
+- (BOOL)mockedProtocolConformsToProtocol:(Protocol *)aProtocol {
+    if (self.mockedProtocol == nil)
+        return NO;
+
+    return protocol_isEqual(self.mockedProtocol, aProtocol) || protocol_conformsToProtocol(self.mockedProtocol, aProtocol);
+}
+
+- (BOOL)isKindOfClass:(Class)aClass {
+    return [self mockedClassHasAncestorClass:aClass] || [super isKindOfClass:aClass];
+}
+
+- (BOOL)isMemberOfClass:(Class)aClass {
+    return self.mockedClass == aClass || [super isMemberOfClass:aClass];
+}
+
+- (BOOL)respondsToSelector:(SEL)aSelector {
+    return [self mockedClassRespondsToSelector:aSelector] ||
+           [self mockedProtocolRespondsToSelector:aSelector] ||
+           [super respondsToSelector:aSelector];
+}
+
+- (BOOL)conformsToProtocol:(Protocol *)aProtocol {
+    return [self mockedClassConformsToProtocol:aProtocol] ||
+           [self mockedProtocolConformsToProtocol:aProtocol] ||
+           [super conformsToProtocol:aProtocol];
+}
+
+#pragma mark -
+#pragma mark Whitelisted NSObject Methods
+
+- (BOOL)isEqual:(id)anObject {
+    KWMessagePattern *messagePattern = [KWMessagePattern messagePatternWithSelector:_cmd];
+    [self expectMessagePattern:messagePattern];
+    NSInvocation *invocation = [NSInvocation invocationWithTarget:self selector:_cmd messageArguments:&anObject];
+
+    if ([self processReceivedInvocation:invocation]) {
+        BOOL result = NO;
+        [invocation getReturnValue:&result];
+        return result;
+    } else {
+        return [super isEqual:anObject];
+    }
+}
+
+- (NSUInteger)hash {
+    KWMessagePattern *messagePattern = [KWMessagePattern messagePatternWithSelector:_cmd];
+    [self expectMessagePattern:messagePattern];
+    NSInvocation *invocation = [NSInvocation invocationWithTarget:self selector:_cmd];
+
+    if ([self processReceivedInvocation:invocation]) {
+        NSUInteger result = 0;
+        [invocation getReturnValue:&result];
+        return result;
+    } else {
+        return [super hash];
+    }
+}
+
+- (NSString *)description {
+    KWMessagePattern *messagePattern = [KWMessagePattern messagePatternWithSelector:_cmd];
+    [self expectMessagePattern:messagePattern];
+    NSInvocation *invocation = [NSInvocation invocationWithTarget:self selector:_cmd];
+
+    if ([self processReceivedInvocation:invocation]) {
+        NSString *result = nil;
+        [invocation getReturnValue:&result];
+        return result;
+    } else {
+        return [super description];
+    }
+}
+
+- (id)copy {
+    KWMessagePattern *messagePattern = [KWMessagePattern messagePatternWithSelector:_cmd];
+    [self expectMessagePattern:messagePattern];
+    NSInvocation *invocation = [NSInvocation invocationWithTarget:self selector:_cmd];
+
+    if ([self processReceivedInvocation:invocation]) {
+        id result = nil;
+        [invocation getReturnValue:&result];
+        return result;
+    } else {
+        return [super copy];
+    }
+}
+
+- (id)mutableCopy {
+    KWMessagePattern *messagePattern = [KWMessagePattern messagePatternWithSelector:_cmd];
+    [self expectMessagePattern:messagePattern];
+    NSInvocation *invocation = [NSInvocation invocationWithTarget:self selector:_cmd];
+
+    if ([self processReceivedInvocation:invocation]) {
+        id result = nil;
+        [invocation getReturnValue:&result];
+        return result;
+    } else {
+        return [super mutableCopy];
+    }
+}
+
+#pragma mark -
+#pragma mark Key-Value Coding Support
+
+static id valueForKeyImplementation(id self, SEL _cmd, id key) {
+    KWMessagePattern *messagePattern = [KWMessagePattern messagePatternWithSelector:_cmd];
+    [self expectMessagePattern:messagePattern];
+    NSInvocation *invocation = [NSInvocation invocationWithTarget:self selector:_cmd messageArguments:&key];
+    
+    if ([self processReceivedInvocation:invocation]) {
+        id result = nil;
+        [invocation getReturnValue:&result];
+        return result;
+    } else {
+        return nil;
+    }
+}
+
+- (id)valueForKey:(NSString *)key {
+    return valueForKeyImplementation(self, _cmd, key);
+}
+
+- (id)valueForKeyPath:(NSString *)keyPath {
+    return valueForKeyImplementation(self, _cmd, keyPath);
+}
+
+static void setValueForKeyImplementation(id self, SEL _cmd, id a, id b) {
+    KWMessagePattern *messagePattern = [KWMessagePattern messagePatternWithSelector:_cmd];
+    [self expectMessagePattern:messagePattern];
+    NSInvocation *invocation = [NSInvocation invocationWithTarget:self selector:_cmd messageArguments:&a, &b];
+    
+    [self processReceivedInvocation:invocation];
+}
+
+- (void)setValue:(id)value forKey:(NSString *)key {
+    setValueForKeyImplementation(self, _cmd, value, key);
+}
+
+- (void)setValue:(id)value forKeyPath:(NSString *)keyPath {
+    setValueForKeyImplementation(self, _cmd, value, keyPath);
+}
+
+@end
Pods/Kiwi/Classes/KWNull.h
@@ -0,0 +1,19 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+
+// KWNull exists to represent the same thing as NSNull, except that Kiwi needs
+// to distinguish between null singletons used internally and those a user
+// is using as an object parameter.
+@interface KWNull : NSObject
+
+#pragma mark -
+#pragma mark Initializing
+
++ (id)null;
+
+@end
Pods/Kiwi/Classes/KWNull.m
@@ -0,0 +1,47 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWNull.h"
+
+@implementation KWNull
+
+#pragma mark -
+#pragma mark Initializing
+
+static KWNull *sharedNull = nil;
+
++ (id)null {
+    if (sharedNull == nil) {
+        sharedNull = [[super allocWithZone:nil] init];
+    }
+
+    return sharedNull;
+}
+
++ (id)allocWithZone:(NSZone *)zone {
+    return [[self null] retain];
+}
+
+- (id)copyWithZone:(NSZone *)zone {
+    return self;
+}
+
+- (id)retain {
+    return self;
+}
+
+- (NSUInteger)retainCount {
+    return NSUIntegerMax;
+}
+
+- (oneway void)release {
+}
+
+- (id)autorelease {
+    return self;
+}
+
+@end
Pods/Kiwi/Classes/KWObjCUtilities.h
@@ -0,0 +1,32 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+
+#pragma mark -
+#pragma mark Objective-C Type Utilities
+
+BOOL KWObjCTypeEqualToObjCType(const char *firstObjCType, const char *secondObjCType);
+BOOL KWObjCTypeIsNumeric(const char *objCType);
+BOOL KWObjCTypeIsFloatingPoint(const char *objCType);
+BOOL KWObjCTypeIsIntegral(const char *objCType);
+BOOL KWObjCTypeIsSignedIntegral(const char *objCType);
+BOOL KWObjCTypeIsUnsignedIntegral(const char *objCType);
+BOOL KWObjCTypeIsObject(const char *objCType);
+BOOL KWObjCTypeIsCharString(const char *objCType);
+BOOL KWObjCTypeIsClass(const char *objCType);
+BOOL KWObjCTypeIsSelector(const char *objCType);
+BOOL KWObjCTypeIsPointerToType(const char *objCType);
+BOOL KWObjCTypeIsPointerLike(const char *objCType);
+BOOL KWObjCTypeIsUnknown(const char *objCType);
+BOOL KWObjCTypeIsBlock(const char *objCType);
+
+NSUInteger KWObjCTypeLength(const char *objCType);
+
+#pragma mark -
+#pragma mark Selector Utlities
+
+NSUInteger KWSelectorParameterCount(SEL selector);
Pods/Kiwi/Classes/KWObjCUtilities.m
@@ -0,0 +1,102 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWObjCUtilities.h"
+#import "KWStringUtilities.h"
+
+#pragma mark -
+#pragma mark Objective-C Type Utilities
+
+BOOL KWObjCTypeEqualToObjCType(const char *firstObjCType, const char *secondObjCType) {
+    return strcmp(firstObjCType, secondObjCType) == 0;
+}
+
+BOOL KWObjCTypeIsNumeric(const char *objCType) {
+    return KWObjCTypeIsFloatingPoint(objCType) || KWObjCTypeIsIntegral(objCType);
+}
+
+BOOL KWObjCTypeIsFloatingPoint(const char *objCType) {
+    return strcmp(objCType, @encode(float)) == 0 || strcmp(objCType, @encode(double)) == 0;
+}
+
+BOOL KWObjCTypeIsIntegral(const char *objCType) {
+    return KWObjCTypeIsSignedIntegral(objCType) || KWObjCTypeIsUnsignedIntegral(objCType);
+}
+
+BOOL KWObjCTypeIsSignedIntegral(const char *objCType) {
+    return strcmp(objCType, @encode(char)) == 0 ||
+           strcmp(objCType, @encode(int)) == 0 ||
+           strcmp(objCType, @encode(short)) == 0 ||
+           strcmp(objCType, @encode(long)) == 0 ||
+           strcmp(objCType, @encode(long long)) == 0;
+}
+
+BOOL KWObjCTypeIsUnsignedIntegral(const char *objCType) {
+    return strcmp(objCType, @encode(unsigned char)) == 0 ||
+           strcmp(objCType, @encode(unsigned int)) == 0 ||
+           strcmp(objCType, @encode(unsigned short)) == 0 ||
+           strcmp(objCType, @encode(unsigned long)) == 0 ||
+           strcmp(objCType, @encode(unsigned long long)) == 0;
+}
+
+BOOL KWObjCTypeIsObject(const char *objCType) {
+    return strcmp(objCType, @encode(id)) == 0 || strcmp(objCType, "@?") == 0;
+}
+
+BOOL KWObjCTypeIsCharString(const char *objCType) {
+    return strcmp(objCType, @encode(char *)) == 0;
+}
+
+BOOL KWObjCTypeIsClass(const char *objCType) {
+    return strcmp(objCType, @encode(Class)) == 0;
+}
+
+BOOL KWObjCTypeIsSelector(const char *objCType) {
+    return strcmp(objCType, @encode(SEL)) == 0;
+}
+
+BOOL KWObjCTypeIsPointerToType(const char *objCType) {
+    return *objCType == '^';
+}
+
+BOOL KWObjCTypeIsPointerLike(const char *objCType) {
+    return KWObjCTypeIsObject(objCType) ||
+           KWObjCTypeIsCharString(objCType) ||
+           KWObjCTypeIsClass(objCType) ||
+           KWObjCTypeIsSelector(objCType) ||
+           KWObjCTypeIsPointerToType(objCType);
+}
+
+BOOL KWObjCTypeIsUnknown(const char *objCType) {
+    return *objCType == '?';
+}
+
+NSUInteger KWObjCTypeLength(const char *objCType) {
+    NSString *encoding = KWEncodingWithObjCTypes(objCType, @encode(id), @encode(SEL), nil);
+    NSMethodSignature *signature = [NSMethodSignature signatureWithObjCTypes:[encoding UTF8String]];
+    return [signature methodReturnLength];
+}
+
+BOOL KWObjCTypeIsBlock(const char *objCType) {
+    return strcmp(objCType, "@?") == 0;
+}
+
+
+#pragma mark -
+#pragma mark Selector Utlities
+
+NSUInteger KWSelectorParameterCount(SEL selector) {
+    NSString *selectorString = NSStringFromSelector(selector);
+    NSUInteger length = [selectorString length];
+    NSUInteger parameterCount = 0;
+
+    for (NSUInteger i = 0; i < length; ++i) {
+        if ([selectorString characterAtIndex:i] == ':')
+            ++parameterCount;
+    }
+
+    return parameterCount;
+}
Pods/Kiwi/Classes/KWPendingNode.h
@@ -0,0 +1,37 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+#import "KWExampleNode.h"
+
+@class KWContextNode;
+@class KWCallSite;
+
+@interface KWPendingNode : NSObject<KWExampleNode> {
+@private
+    KWCallSite *callSite;
+    NSString *description;
+}
+@property (nonatomic, readonly, retain) KWContextNode *context;
+
+#pragma mark -
+#pragma mark Initializing
+
+- (id)initWithCallSite:(KWCallSite *)aCallSite context:(KWContextNode *)context description:(NSString *)aDescription;
+
++ (id)pendingNodeWithCallSite:(KWCallSite *)aCallSite context:(KWContextNode *)context description:(NSString *)aDescription;
+
+#pragma mark -
+#pragma mark Getting Call Sites
+
+@property (nonatomic, readonly) KWCallSite *callSite;
+
+#pragma mark -
+#pragma mark Getting Descriptions
+
+@property (nonatomic, readonly) NSString *description;
+
+@end
Pods/Kiwi/Classes/KWPendingNode.m
@@ -0,0 +1,72 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWPendingNode.h"
+#import "KWExampleNodeVisitor.h"
+#import "KWContextNode.h"
+
+@implementation KWPendingNode
+
+@synthesize context = _context;
+
+#pragma mark -
+#pragma mark Initializing
+
+- (id)initWithCallSite:(KWCallSite *)aCallSite context:(KWContextNode *)context description:(NSString *)aDescription {
+    if ((self = [super init])) {
+        callSite = [aCallSite retain];
+        description = [aDescription copy];
+        _context = [context retain];
+    }
+
+    return self;
+}
+
++ (id)pendingNodeWithCallSite:(KWCallSite *)aCallSite context:(KWContextNode *)context description:(NSString *)aDescription {
+    return [[[self alloc] initWithCallSite:aCallSite context:context description:aDescription] autorelease];
+}
+
+- (void)dealloc {
+    [_context release];
+    [callSite release];
+    [description release];
+    [super dealloc];
+}
+
+#pragma mark -
+#pragma mark Getting Call Sites
+
+@synthesize callSite;
+
+#pragma mark -
+#pragma mark Getting Descriptions
+
+@synthesize description;
+
+#pragma mark -
+#pragma mark Accepting Visitors
+
+- (void)acceptExampleNodeVisitor:(id<KWExampleNodeVisitor>)aVisitor {
+    [aVisitor visitPendingNode:self];
+}
+
+#pragma mark -
+#pragma mark - Accessing the context stack
+
+- (NSArray *)contextStack
+{
+    NSMutableArray *contextStack = [NSMutableArray array];
+    
+    KWContextNode *currentContext = _context;
+    
+    while (currentContext) {
+        [contextStack addObject:currentContext];
+        currentContext = currentContext.parentContext;
+    }
+    return contextStack;
+}
+
+@end
Pods/Kiwi/Classes/KWProbe.h
@@ -0,0 +1,14 @@
+//
+//  KWProbe.h
+//  iOSFalconCore
+//
+//  Created by Luke Redpath on 13/01/2011.
+//  Copyright 2011 LJR Software Limited. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+@protocol KWProbe <NSObject>
+- (BOOL)isSatisfied;
+- (void)sample;
+@end
Pods/Kiwi/Classes/KWProbePoller.h
@@ -0,0 +1,21 @@
+//
+//  KWProbePoller.h
+//  iOSFalconCore
+//
+//  Created by Luke Redpath on 13/01/2011.
+//  Copyright 2011 LJR Software Limited. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+#import "KWProbe.h"
+
+#define kKW_DEFAULT_PROBE_DELAY 0.1
+
+@interface KWProbePoller : NSObject
+{
+  NSTimeInterval timeoutInterval;
+  NSTimeInterval delayInterval;
+}
+- (id)initWithTimeout:(NSTimeInterval)theTimeout delay:(NSTimeInterval)theDelay;
+- (BOOL)check:(id<KWProbe>)probe;
+@end
Pods/Kiwi/Classes/KWProbePoller.m
@@ -0,0 +1,72 @@
+//
+//  KWProbePoller.m
+//  iOSFalconCore
+//
+//  Created by Luke Redpath on 13/01/2011.
+//  Copyright 2011 LJR Software Limited. All rights reserved.
+//
+
+#import "KWProbePoller.h"
+
+@interface KWTimeout : NSObject
+{
+  NSDate *timeoutDate;
+}
+- (id)initWithTimeout:(NSTimeInterval)timeout;
+- (BOOL)hasTimedOut;
+@end
+
+@implementation KWTimeout
+
+- (id)initWithTimeout:(NSTimeInterval)timeout
+{
+  if ((self = [super init])) {
+    timeoutDate = [[NSDate alloc] initWithTimeIntervalSinceNow:timeout];
+  }
+  return self;
+}
+
+- (void)dealloc
+{
+  [timeoutDate release];
+  [super dealloc];
+}
+
+- (BOOL)hasTimedOut
+{
+  return [timeoutDate timeIntervalSinceDate:[NSDate date]] < 0;
+}
+
+@end
+
+#pragma mark -
+
+@implementation KWProbePoller
+
+- (id)initWithTimeout:(NSTimeInterval)theTimeout delay:(NSTimeInterval)theDelay;
+{
+  if ((self = [super init])) {
+    timeoutInterval = theTimeout;
+    delayInterval = theDelay;
+  }
+  return self;
+}
+
+- (BOOL)check:(id<KWProbe>)probe;
+{
+  KWTimeout *timeout = [[KWTimeout alloc] initWithTimeout:timeoutInterval];
+
+  while (![probe isSatisfied]) {
+    if ([timeout hasTimedOut]) {
+      [timeout release];
+      return NO;
+    }
+    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:delayInterval]];
+    [probe sample];
+  }
+  [timeout release];
+
+  return YES;
+}
+
+@end
Pods/Kiwi/Classes/KWRaiseMatcher.h
@@ -0,0 +1,25 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+#import "KWMatcher.h"
+
+@interface KWRaiseMatcher : KWMatcher {
+@private
+    SEL selector;
+    NSException *exception;
+    NSException *actualException;
+}
+
+#pragma mark -
+#pragma mark Configuring Matchers
+
+- (void)raiseWhenSent:(SEL)aSelector;
+- (void)raiseWithName:(NSString *)aName whenSent:(SEL)aSelector;
+- (void)raiseWithReason:(NSString *)aReason whenSent:(SEL)aSelector;
+- (void)raiseWithName:(NSString *)aName reason:(NSString *)aReason whenSent:(SEL)aSelector;
+
+@end
Pods/Kiwi/Classes/KWRaiseMatcher.m
@@ -0,0 +1,126 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWRaiseMatcher.h"
+#import "KWFormatter.h"
+
+@interface KWRaiseMatcher()
+
+#pragma mark -
+#pragma mark Properties
+
+@property (nonatomic, readwrite) SEL selector;
+@property (nonatomic, readwrite, retain) NSException *exception;
+@property (nonatomic, readwrite, retain) NSException *actualException;
+
+@end
+
+@implementation KWRaiseMatcher
+
+#pragma mark -
+#pragma mark Initializing
+
+- (void)dealloc {
+    [exception release];
+    [actualException release];
+    [super dealloc];
+}
+
+#pragma mark -
+#pragma mark Properties
+
+@synthesize selector;
+@synthesize exception;
+@synthesize actualException;
+
+#pragma mark -
+#pragma mark Getting Matcher Strings
+
++ (NSArray *)matcherStrings {
+    return @[@"raiseWhenSent:",
+                                     @"raiseWithName:whenSent:",
+                                     @"raiseWithReason:whenSent:",
+                                     @"raiseWithName:reason:whenSent:"];
+}
+
+#pragma mark -
+#pragma mark Matching
+
+- (BOOL)evaluate {
+    @try {
+        [self.subject performSelector:self.selector];
+    } @catch (NSException *anException) {
+        self.actualException = anException;
+
+        if ([self.exception name] != nil && ![[self.exception name] isEqualToString:[anException name]])
+            return NO;
+
+        if ([self.exception reason] != nil && ![[self.exception reason] isEqualToString:[anException reason]])
+            return NO;
+
+        return YES;
+    }
+
+    return NO;
+}
+
+#pragma mark -
+#pragma mark Getting Failure Messages
+
++ (NSString *)exceptionPhraseWithException:(NSException *)anException {
+    if (anException == nil)
+        return @"nothing";
+
+    NSString *namePhrase = nil;
+
+    if ([anException name] == nil)
+        namePhrase = @"exception";
+    else
+        namePhrase = [anException name];
+
+    if ([anException reason] == nil)
+        return namePhrase;
+
+    return [NSString stringWithFormat:@"%@ \"%@\"", namePhrase, [anException reason]];
+}
+
+- (NSString *)failureMessageForShould {
+    return [NSString stringWithFormat:@"expected %@, but %@ raised",
+                                      [[self class] exceptionPhraseWithException:self.exception],
+                                      [[self class] exceptionPhraseWithException:self.actualException]];
+}
+
+- (NSString *)failureMessageForShouldNot {
+    return [NSString stringWithFormat:@"expected %@ not to be raised",
+                                      [[self class] exceptionPhraseWithException:self.actualException]];
+}
+
+- (NSString *)description
+{
+  return [NSString stringWithFormat:@"raise %@ when sent %@", [[self class] exceptionPhraseWithException:self.exception], NSStringFromSelector(self.selector)];
+}
+
+#pragma mark -
+#pragma mark Configuring Matchers
+
+- (void)raiseWhenSent:(SEL)aSelector {
+    [self raiseWithName:nil reason:nil whenSent:aSelector];
+}
+
+- (void)raiseWithName:(NSString *)aName whenSent:(SEL)aSelector {
+    [self raiseWithName:aName reason:nil whenSent:aSelector];
+}
+
+- (void)raiseWithReason:(NSString *)aReason whenSent:(SEL)aSelector {
+    [self raiseWithName:nil reason:aReason whenSent:aSelector];
+}
+
+- (void)raiseWithName:(NSString *)aName reason:(NSString *)aReason whenSent:(SEL)aSelector {
+    self.selector = aSelector;
+    self.exception = [NSException exceptionWithName:aName reason:aReason userInfo:nil];
+}
+
+@end
Pods/Kiwi/Classes/KWReceiveMatcher.h
@@ -0,0 +1,63 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+#import "KWCountType.h"
+#import "KWMatcher.h"
+#import "KWMatchVerifier.h"
+
+@class KWMessagePattern;
+@class KWMessageTracker;
+
+@interface KWReceiveMatcher : KWMatcher {
+@private
+    KWMessageTracker *messageTracker;
+    BOOL willEvaluateMultipleTimes;
+}
+@property (nonatomic, assign) BOOL willEvaluateMultipleTimes;
+
+#pragma mark -
+#pragma mark Configuring Matchers
+
+- (void)receive:(SEL)aSelector;
+- (void)receive:(SEL)aSelector withCount:(NSUInteger)aCount;
+- (void)receive:(SEL)aSelector withCountAtLeast:(NSUInteger)aCount;
+- (void)receive:(SEL)aSelector withCountAtMost:(NSUInteger)aCount;
+- (void)receive:(SEL)aSelector andReturn:(id)aValue;
+- (void)receive:(SEL)aSelector andReturn:(id)aValue withCount:(NSUInteger)aCount;
+- (void)receive:(SEL)aSelector andReturn:(id)aValue withCountAtLeast:(NSUInteger)aCount;
+- (void)receive:(SEL)aSelector andReturn:(id)aValue withCountAtMost:(NSUInteger)aCount;
+- (void)receiveMessagePattern:(KWMessagePattern *)aMessagePattern countType:(KWCountType)aCountType count:(NSUInteger)aCount;
+- (void)receiveMessagePattern:(KWMessagePattern *)aMessagePattern andReturn:(id)aValue countType:(KWCountType)aCountType count:(NSUInteger)aCount;
+
+@end
+
+@interface KWMatchVerifier(KWReceiveMatcherAdditions)
+
+#pragma mark -
+#pragma mark Verifying
+
+- (void)receive:(SEL)aSelector withArguments:(id)firstArgument, ...;
+- (void)receive:(SEL)aSelector withCount:(NSUInteger)aCount arguments:(id)firstArgument, ...;
+- (void)receive:(SEL)aSelector withCountAtLeast:(NSUInteger)aCount arguments:(id)firstArgument, ...;
+- (void)receive:(SEL)aSelector withCountAtMost:(NSUInteger)aCount arguments:(id)firstArgument, ...;
+- (void)receive:(SEL)aSelector andReturn:(id)aValue withArguments:(id)firstArgument, ...;
+- (void)receive:(SEL)aSelector andReturn:(id)aValue withCount:(NSUInteger)aCount arguments:(id)firstArgument, ...;
+- (void)receive:(SEL)aSelector andReturn:(id)aValue withCountAtLeast:(NSUInteger)aCount arguments:(id)firstArgument, ...;
+- (void)receive:(SEL)aSelector andReturn:(id)aValue withCountAtMost:(NSUInteger)aCount arguments:(id)firstArgument, ...;
+
+#pragma mark Invocation Capturing Methods
+
+- (id)receive;
+- (id)receiveWithCount:(NSUInteger)aCount;
+- (id)receiveWithCountAtLeast:(NSUInteger)aCount;
+- (id)receiveWithCountAtMost:(NSUInteger)aCount;
+- (id)receiveAndReturn:(id)aValue;
+- (id)receiveAndReturn:(id)aValue withCount:(NSUInteger)aCount;
+- (id)receiveAndReturn:(id)aValue withCountAtLeast:(NSUInteger)aCount;
+- (id)receiveAndReturn:(id)aValue withCountAtMost:(NSUInteger)aCount;
+
+@end
Pods/Kiwi/Classes/KWReceiveMatcher.m
@@ -0,0 +1,321 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWReceiveMatcher.h"
+#import "KWFormatter.h"
+#import "KWInvocationCapturer.h"
+#import "KWMessagePattern.h"
+#import "KWMessageTracker.h"
+#import "KWObjCUtilities.h"
+#import "KWStringUtilities.h"
+#import "KWWorkarounds.h"
+#import "NSObject+KiwiStubAdditions.h"
+
+static NSString * const MatchVerifierKey = @"MatchVerifierKey";
+static NSString * const CountTypeKey = @"CountTypeKey";
+static NSString * const CountKey = @"CountKey";
+static NSString * const StubValueKey = @"StubValueKey";
+
+@interface KWReceiveMatcher()
+
+#pragma mark -
+#pragma mark Properties
+
+@property (nonatomic, readwrite, retain) KWMessageTracker *messageTracker;
+
+@end
+
+@implementation KWReceiveMatcher
+
+#pragma mark -
+#pragma mark Initializing
+
+- (id)initWithSubject:(id)anObject {
+  if ((self = [super initWithSubject:anObject])) {
+    self.willEvaluateMultipleTimes = NO;
+  }
+
+  return self;
+}
+
+- (void)dealloc {
+    [messageTracker release];
+    [super dealloc];
+}
+
+#pragma mark -
+#pragma mark Properties
+
+@synthesize messageTracker;
+@synthesize willEvaluateMultipleTimes;
+
+#pragma mark -
+#pragma mark Getting Matcher Strings
+
++ (NSArray *)matcherStrings {
+    return @[@"receive:",
+                                     @"receive:withCount:",
+                                     @"receive:withCountAtLeast:",
+                                     @"receive:withCountAtMost:",
+                                     @"receive:andReturn:",
+                                     @"receive:andReturn:withCount:",
+                                     @"receive:andReturn:withCountAtLeast:",
+                                     @"receive:andReturn:withCountAtMost:",
+                                     @"receiveMessagePattern:countType:count:",
+                                     @"receiveMessagePattern:andReturn:countType:count:"];
+}
+
+#pragma mark -
+#pragma mark Matching
+
+- (BOOL)shouldBeEvaluatedAtEndOfExample {
+    return YES;
+}
+
+- (BOOL)evaluate {
+    BOOL succeeded = [self.messageTracker succeeded];
+
+    if (!self.willEvaluateMultipleTimes) {
+      [self.messageTracker stopTracking];
+    }
+    return succeeded;
+}
+
+#pragma mark -
+#pragma mark Getting Failure Messages
+
+- (NSString *)failureMessageForShould {
+    return [NSString stringWithFormat:@"expected subject to receive -%@ %@, but received it %@",
+                                      [self.messageTracker.messagePattern stringValue],
+                                      [self.messageTracker expectedCountPhrase],
+                                      [self.messageTracker receivedCountPhrase]];
+}
+
+- (NSString *)failureMessageForShouldNot {
+    return [NSString stringWithFormat:@"expected subject not to receive -%@, but received it %@",
+                                      [self.messageTracker.messagePattern stringValue],
+                                      [self.messageTracker receivedCountPhrase]];
+}
+
+#pragma mark -
+#pragma mark Configuring Matchers
+
+- (void)receive:(SEL)aSelector {
+    KWMessagePattern *messagePattern = [KWMessagePattern messagePatternWithSelector:aSelector];
+    [self receiveMessagePattern:messagePattern countType:KWCountTypeExact count:1];
+}
+
+- (void)receive:(SEL)aSelector withCount:(NSUInteger)aCount {
+    KWMessagePattern *messagePattern = [KWMessagePattern messagePatternWithSelector:aSelector];
+    return [self receiveMessagePattern:messagePattern countType:KWCountTypeExact count:aCount];
+}
+
+- (void)receive:(SEL)aSelector withCountAtLeast:(NSUInteger)aCount {
+    KWMessagePattern *messagePattern = [KWMessagePattern messagePatternWithSelector:aSelector];
+    return [self receiveMessagePattern:messagePattern countType:KWCountTypeAtLeast count:aCount];
+}
+
+- (void)receive:(SEL)aSelector withCountAtMost:(NSUInteger)aCount {
+    KWMessagePattern *messagePattern = [KWMessagePattern messagePatternWithSelector:aSelector];
+    return [self receiveMessagePattern:messagePattern countType:KWCountTypeAtMost count:aCount];
+}
+
+- (void)receive:(SEL)aSelector andReturn:(id)aValue {
+    KWMessagePattern *messagePattern = [KWMessagePattern messagePatternWithSelector:aSelector];
+    [self receiveMessagePattern:messagePattern andReturn:aValue countType:KWCountTypeExact count:1];
+}
+
+- (void)receive:(SEL)aSelector andReturn:(id)aValue withCount:(NSUInteger)aCount {
+    KWMessagePattern *messagePattern = [KWMessagePattern messagePatternWithSelector:aSelector];
+    [self receiveMessagePattern:messagePattern andReturn:aValue countType:KWCountTypeExact count:aCount];
+}
+
+- (void)receive:(SEL)aSelector andReturn:(id)aValue withCountAtLeast:(NSUInteger)aCount {
+    KWMessagePattern *messagePattern = [KWMessagePattern messagePatternWithSelector:aSelector];
+    [self receiveMessagePattern:messagePattern andReturn:aValue countType:KWCountTypeAtLeast count:aCount];
+}
+
+- (void)receive:(SEL)aSelector andReturn:(id)aValue withCountAtMost:(NSUInteger)aCount {
+    KWMessagePattern *messagePattern = [KWMessagePattern messagePatternWithSelector:aSelector];
+    [self receiveMessagePattern:messagePattern andReturn:aValue countType:KWCountTypeAtMost count:aCount];
+}
+
+- (void)receiveMessagePattern:(KWMessagePattern *)aMessagePattern countType:(KWCountType)aCountType count:(NSUInteger)aCount {
+#if KW_TARGET_HAS_INVOCATION_EXCEPTION_BUG
+    @try {
+#endif // #if KW_TARGET_HAS_INVOCATION_EXCEPTION_BUG
+
+    [self.subject stubMessagePattern:aMessagePattern andReturn:nil overrideExisting:NO];
+    self.messageTracker = [KWMessageTracker messageTrackerWithSubject:self.subject messagePattern:aMessagePattern countType:aCountType count:aCount];
+
+#if KW_TARGET_HAS_INVOCATION_EXCEPTION_BUG
+    } @catch(NSException *exception) {
+        KWSetExceptionFromAcrossInvocationBoundary(exception);
+    }
+#endif // #if KW_TARGET_HAS_INVOCATION_EXCEPTION_BUG
+}
+
+- (void)receiveMessagePattern:(KWMessagePattern *)aMessagePattern andReturn:(id)aValue countType:(KWCountType)aCountType count:(NSUInteger)aCount {
+#if KW_TARGET_HAS_INVOCATION_EXCEPTION_BUG
+    @try {
+#endif // #if KW_TARGET_HAS_INVOCATION_EXCEPTION_BUG
+
+    [self.subject stubMessagePattern:aMessagePattern andReturn:aValue];
+    self.messageTracker = [KWMessageTracker messageTrackerWithSubject:self.subject messagePattern:aMessagePattern countType:aCountType count:aCount];
+
+#if KW_TARGET_HAS_INVOCATION_EXCEPTION_BUG
+    } @catch(NSException *exception) {
+        KWSetExceptionFromAcrossInvocationBoundary(exception);
+    }
+#endif // #if KW_TARGET_HAS_INVOCATION_EXCEPTION_BUG
+}
+
+#pragma mark -
+#pragma mark Capturing Invocations
+
++ (NSMethodSignature *)invocationCapturer:(KWInvocationCapturer *)anInvocationCapturer methodSignatureForSelector:(SEL)aSelector {
+    KWMatchVerifier *verifier = (anInvocationCapturer.userInfo)[MatchVerifierKey];
+
+    if ([verifier.subject respondsToSelector:aSelector])
+        return [verifier.subject methodSignatureForSelector:aSelector];
+
+    NSString *encoding = KWEncodingForVoidMethod();
+    return [NSMethodSignature signatureWithObjCTypes:[encoding UTF8String]];
+}
+
++ (void)invocationCapturer:(KWInvocationCapturer *)anInvocationCapturer didCaptureInvocation:(NSInvocation *)anInvocation {
+    NSDictionary *userInfo = anInvocationCapturer.userInfo;
+    id verifier = userInfo[MatchVerifierKey];
+    KWCountType countType = [userInfo[CountTypeKey] unsignedIntegerValue];
+    NSUInteger count = [userInfo[CountKey] unsignedIntegerValue];
+    NSValue *stubValue = userInfo[StubValueKey];
+    KWMessagePattern *messagePattern = [KWMessagePattern messagePatternFromInvocation:anInvocation];
+
+    if (stubValue != nil)
+        [verifier receiveMessagePattern:messagePattern andReturn:[stubValue nonretainedObjectValue] countType:countType count:count];
+    else
+        [verifier receiveMessagePattern:messagePattern countType:countType count:count];
+}
+
+@end
+
+@implementation KWMatchVerifier(KWReceiveMatcherAdditions)
+
+#pragma mark -
+#pragma mark Verifying
+
+- (void)receive:(SEL)aSelector withArguments:(id)firstArgument, ... {
+    va_list argumentList;
+    va_start(argumentList, firstArgument);
+    KWMessagePattern *messagePattern = [KWMessagePattern messagePatternWithSelector:aSelector firstArgumentFilter:firstArgument argumentList:argumentList];
+    [(id)self receiveMessagePattern:messagePattern countType:KWCountTypeExact count:1];
+}
+
+- (void)receive:(SEL)aSelector withCount:(NSUInteger)aCount arguments:(id)firstArgument, ... {
+    va_list argumentList;
+    va_start(argumentList, firstArgument);
+    KWMessagePattern *messagePattern = [KWMessagePattern messagePatternWithSelector:aSelector firstArgumentFilter:firstArgument argumentList:argumentList];
+    [(id)self receiveMessagePattern:messagePattern countType:KWCountTypeExact count:aCount];
+}
+
+- (void)receive:(SEL)aSelector withCountAtLeast:(NSUInteger)aCount arguments:(id)firstArgument, ... {
+    va_list argumentList;
+    va_start(argumentList, firstArgument);
+    KWMessagePattern *messagePattern = [KWMessagePattern messagePatternWithSelector:aSelector firstArgumentFilter:firstArgument argumentList:argumentList];
+    [(id)self receiveMessagePattern:messagePattern countType:KWCountTypeAtLeast count:aCount];
+}
+
+- (void)receive:(SEL)aSelector withCountAtMost:(NSUInteger)aCount arguments:(id)firstArgument, ... {
+    va_list argumentList;
+    va_start(argumentList, firstArgument);
+    KWMessagePattern *messagePattern = [KWMessagePattern messagePatternWithSelector:aSelector firstArgumentFilter:firstArgument argumentList:argumentList];
+    [(id)self receiveMessagePattern:messagePattern countType:KWCountTypeAtMost count:aCount];
+}
+
+- (void)receive:(SEL)aSelector andReturn:(id)aValue withArguments:(id)firstArgument, ... {
+    va_list argumentList;
+    va_start(argumentList, firstArgument);
+    KWMessagePattern *messagePattern = [KWMessagePattern messagePatternWithSelector:aSelector firstArgumentFilter:firstArgument argumentList:argumentList];
+    [(id)self receiveMessagePattern:messagePattern andReturn:aValue countType:KWCountTypeExact count:1];
+}
+
+- (void)receive:(SEL)aSelector andReturn:(id)aValue withCount:(NSUInteger)aCount arguments:(id)firstArgument, ... {
+    va_list argumentList;
+    va_start(argumentList, firstArgument);
+    KWMessagePattern *messagePattern = [KWMessagePattern messagePatternWithSelector:aSelector firstArgumentFilter:firstArgument argumentList:argumentList];
+    [(id)self receiveMessagePattern:messagePattern andReturn:aValue countType:KWCountTypeExact count:aCount];
+}
+
+- (void)receive:(SEL)aSelector andReturn:(id)aValue withCountAtLeast:(NSUInteger)aCount arguments:(id)firstArgument, ... {
+    va_list argumentList;
+    va_start(argumentList, firstArgument);
+    KWMessagePattern *messagePattern = [KWMessagePattern messagePatternWithSelector:aSelector firstArgumentFilter:firstArgument argumentList:argumentList];
+    [(id)self receiveMessagePattern:messagePattern andReturn:aValue countType:KWCountTypeAtLeast count:aCount];
+}
+
+- (void)receive:(SEL)aSelector andReturn:(id)aValue withCountAtMost:(NSUInteger)aCount arguments:(id)firstArgument, ... {
+    va_list argumentList;
+    va_start(argumentList, firstArgument);
+    KWMessagePattern *messagePattern = [KWMessagePattern messagePatternWithSelector:aSelector firstArgumentFilter:firstArgument argumentList:argumentList];
+    [(id)self receiveMessagePattern:messagePattern andReturn:aValue countType:KWCountTypeAtMost count:aCount];
+}
+
+#pragma mark Invocation Capturing Methods
+
+- (NSDictionary *)userInfoForReceiveMatcherWithCountType:(KWCountType)aCountType count:(NSUInteger)aCount {
+    return @{MatchVerifierKey: self,
+                                                      CountTypeKey: @(aCountType),
+                                                      CountKey: @(aCount)};
+}
+
+- (NSDictionary *)userInfoForReceiveMatcherWithCountType:(KWCountType)aCountType count:(NSUInteger)aCount value:(id)aValue {
+    return @{MatchVerifierKey: self,
+                                                      CountTypeKey: @(aCountType),
+                                                      CountKey: @(aCount),
+                                                      StubValueKey: [NSValue valueWithNonretainedObject:aValue]};
+}
+
+- (id)receive {
+    NSDictionary *userInfo = [self userInfoForReceiveMatcherWithCountType:KWCountTypeExact count:1];
+    return [KWInvocationCapturer invocationCapturerWithDelegate:[KWReceiveMatcher class] userInfo:userInfo];
+}
+
+- (id)receiveWithCount:(NSUInteger)aCount {
+    NSDictionary *userInfo = [self userInfoForReceiveMatcherWithCountType:KWCountTypeExact count:aCount];
+    return [KWInvocationCapturer invocationCapturerWithDelegate:[KWReceiveMatcher class] userInfo:userInfo];
+}
+
+- (id)receiveWithCountAtLeast:(NSUInteger)aCount {
+    NSDictionary *userInfo = [self userInfoForReceiveMatcherWithCountType:KWCountTypeAtLeast count:aCount];
+    return [KWInvocationCapturer invocationCapturerWithDelegate:[KWReceiveMatcher class] userInfo:userInfo];
+}
+
+- (id)receiveWithCountAtMost:(NSUInteger)aCount {
+    NSDictionary *userInfo = [self userInfoForReceiveMatcherWithCountType:KWCountTypeAtMost count:aCount];
+    return [KWInvocationCapturer invocationCapturerWithDelegate:[KWReceiveMatcher class] userInfo:userInfo];
+}
+
+- (id)receiveAndReturn:(id)aValue {
+    NSDictionary *userInfo = [self userInfoForReceiveMatcherWithCountType:KWCountTypeExact count:1 value:aValue];
+    return [KWInvocationCapturer invocationCapturerWithDelegate:[KWReceiveMatcher class] userInfo:userInfo];
+}
+
+- (id)receiveAndReturn:(id)aValue withCount:(NSUInteger)aCount {
+    NSDictionary *userInfo = [self userInfoForReceiveMatcherWithCountType:KWCountTypeExact count:aCount value:aValue];
+    return [KWInvocationCapturer invocationCapturerWithDelegate:[KWReceiveMatcher class] userInfo:userInfo];
+}
+
+- (id)receiveAndReturn:(id)aValue withCountAtLeast:(NSUInteger)aCount {
+    NSDictionary *userInfo = [self userInfoForReceiveMatcherWithCountType:KWCountTypeAtLeast count:aCount value:aValue];
+    return [KWInvocationCapturer invocationCapturerWithDelegate:[KWReceiveMatcher class] userInfo:userInfo];
+}
+
+- (id)receiveAndReturn:(id)aValue withCountAtMost:(NSUInteger)aCount {
+    NSDictionary *userInfo = [self userInfoForReceiveMatcherWithCountType:KWCountTypeAtMost count:aCount value:aValue];
+    return [KWInvocationCapturer invocationCapturerWithDelegate:[KWReceiveMatcher class] userInfo:userInfo];
+}
+
+@end
Pods/Kiwi/Classes/KWRegisterMatchersNode.h
@@ -0,0 +1,35 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+#import "KWExampleNode.h"
+
+@class KWCallSite;
+
+@interface KWRegisterMatchersNode : NSObject<KWExampleNode> {
+@private
+    KWCallSite *callSite;
+    NSString *namespacePrefix;
+}
+
+#pragma mark -
+#pragma mark Initializing
+
+- (id)initWithCallSite:(KWCallSite *)aCallSite namespacePrefix:(NSString *)aNamespacePrefix;
+
++ (id)registerMatchersNodeWithCallSite:(KWCallSite *)aCallSite namespacePrefix:(NSString *)aNamespacePrefix;
+
+#pragma mark -
+#pragma mark Getting Call Sites
+
+@property (nonatomic, readonly) KWCallSite *callSite;
+
+#pragma mark -
+#pragma mark Getting Namespace Prefixes
+
+@property (nonatomic, readonly) NSString *namespacePrefix;
+
+@end
Pods/Kiwi/Classes/KWRegisterMatchersNode.m
@@ -0,0 +1,51 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWRegisterMatchersNode.h"
+#import "KWExampleNodeVisitor.h"
+
+@implementation KWRegisterMatchersNode
+
+#pragma mark -
+#pragma mark Initializing
+
+- (id)initWithCallSite:(KWCallSite *)aCallSite namespacePrefix:(NSString *)aNamespacePrefix {
+    if ((self = [super init])) {
+        callSite = [aCallSite retain];
+        namespacePrefix = [aNamespacePrefix copy];
+    }
+
+    return self;
+}
+
++ (id)registerMatchersNodeWithCallSite:(KWCallSite *)aCallSite namespacePrefix:(NSString *)aNamespacePrefix {
+    return [[[self alloc] initWithCallSite:aCallSite namespacePrefix:aNamespacePrefix] autorelease];
+}
+
+- (void)dealloc {
+    [callSite release];
+    [namespacePrefix release];
+    [super dealloc];
+}
+
+#pragma mark -
+#pragma mark Getting Call Sites
+
+@synthesize callSite;
+
+#pragma mark -
+#pragma mark Getting Namespace Prefixes
+
+@synthesize namespacePrefix;
+
+#pragma mark -
+#pragma mark Accepting Visitors
+
+- (void)acceptExampleNodeVisitor:(id<KWExampleNodeVisitor>)aVisitor {
+    [aVisitor visitRegisterMatchersNode:self];
+}
+
+@end
Pods/Kiwi/Classes/KWReporting.h
@@ -0,0 +1,18 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+
+@class KWFailure;
+
+@protocol KWReporting<NSObject>
+
+#pragma mark -
+#pragma mark Reporting Failures
+
+- (void)reportFailure:(KWFailure *)failure;
+
+@end
Pods/Kiwi/Classes/KWRespondToSelectorMatcher.h
@@ -0,0 +1,20 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+#import "KWMatcher.h"
+
+@interface KWRespondToSelectorMatcher : KWMatcher {
+@private
+    SEL selector;
+}
+
+#pragma mark -
+#pragma mark Configuring Matchers
+
+- (void)respondToSelector:(SEL)aSelector;
+
+@end
Pods/Kiwi/Classes/KWRespondToSelectorMatcher.m
@@ -0,0 +1,60 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWRespondToSelectorMatcher.h"
+#import "KWFormatter.h"
+
+@interface KWRespondToSelectorMatcher()
+
+#pragma mark -
+#pragma mark Properties
+
+@property (nonatomic, readwrite) SEL selector;
+
+@end
+
+@implementation KWRespondToSelectorMatcher
+
+#pragma mark -
+#pragma mark Properties
+
+@synthesize selector;
+
+#pragma mark -
+#pragma mark Getting Matcher Strings
+
++ (NSArray *)matcherStrings {
+    return @[@"respondToSelector:"];
+}
+
+#pragma mark -
+#pragma mark Matching
+
+- (BOOL)evaluate {
+    return [self.subject respondsToSelector:self.selector];
+}
+
+#pragma mark -
+#pragma mark Getting Failure Messages
+
+- (NSString *)failureMessageForShould {
+    return [NSString stringWithFormat:@"expected subject to respond to -%@",
+                                      NSStringFromSelector(self.selector)];
+}
+
+- (NSString *)description
+{
+  return [NSString stringWithFormat:@"respond to -%@", NSStringFromSelector(self.selector)];
+}
+
+#pragma mark -
+#pragma mark Configuring Matchers
+
+- (void)respondToSelector:(SEL)aSelector {
+    self.selector = aSelector;
+}
+
+@end
Pods/Kiwi/Classes/KWSpec.h
@@ -0,0 +1,31 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+#import <SenTestingKit/SenTestingKit.h>
+#import "KWExpectationType.h"
+#import "KWVerifying.h"
+#import "KWExampleGroupDelegate.h"
+
+
+@class KWCallSite;
+
+@interface KWSpec : SenTestCase<KWExampleDelegate>
+
+#pragma mark -
+#pragma mark Adding Verifiers
+
++ (id)addVerifier:(id<KWVerifying>)aVerifier;
++ (id)addExistVerifierWithExpectationType:(KWExpectationType)anExpectationType callSite:(KWCallSite *)aCallSite;
++ (id)addMatchVerifierWithExpectationType:(KWExpectationType)anExpectationType callSite:(KWCallSite *)aCallSite;
++ (id)addAsyncVerifierWithExpectationType:(KWExpectationType)anExpectationType callSite:(KWCallSite *)aCallSite timeout:(NSInteger)timeout;
+
+#pragma mark -
+#pragma mark Building Example Groups
+
++ (void)buildExampleGroups;
+
+@end
Pods/Kiwi/Classes/KWSpec.m
@@ -0,0 +1,145 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWSpec.h"
+#import <objc/runtime.h>
+#import "KWExample.h"
+#import "KWExampleGroupBuilder.h"
+#import "KWIntercept.h"
+#import "KWObjCUtilities.h"
+#import "KWStringUtilities.h"
+#import "NSMethodSignature+KiwiAdditions.h"
+#import "KWFailure.h"
+#import "KWExampleSuite.h"
+
+
+@interface KWSpec()
+
+#pragma mark -
+#pragma mark Properties
+
+@property (nonatomic, retain) KWExample *example;
+
+@end
+
+@implementation KWSpec
+
+@synthesize example;
+
+- (void)dealloc 
+{
+    [example release];
+    [super dealloc];
+}
+
+/* This method is only implemented by sub-classes */
+
++ (void)buildExampleGroups {}
+
+/* Reported by XCode SenTestingKit Runner before and after invocation of the test
+   Use camel case to make method friendly names from example description
+ */
+
+- (NSString *)description
+{
+    KWExample *currentExample = self.example ? self.example : [[self invocation] kw_example];
+    NSString *name = [currentExample descriptionWithContext];
+    
+    // CamelCase the string
+    NSArray *words = [name componentsSeparatedByString:@" "];
+    name = @"";
+    for (NSString *word in words) {
+        if ([word length] < 1)
+        {
+            continue;
+        }
+        name = [name stringByAppendingString:[[word substringToIndex:1] uppercaseString]];
+        name = [name stringByAppendingString:[word substringFromIndex:1]];
+    }
+    
+    // Replace the commas with underscores to separate the levels of context
+    name = [name stringByReplacingOccurrencesOfString:@"," withString:@"_"];
+    
+    // Strip out characters not legal in function names
+    NSError *error = nil;
+    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"[^a-zA-Z0-9_]*" options:0 error:&error];
+    name = [regex stringByReplacingMatchesInString:name options:0 range:NSMakeRange(0, name.length) withTemplate:@""];
+
+    return [NSString stringWithFormat:@"-[%@ %@]", NSStringFromClass([self class]), name];
+}
+
+#pragma mark -
+#pragma mark Getting Invocations
+
+/* Called by the SenTestingKit test suite to get an array of invocations that
+   should be run on instances of test cases. */
+
++ (NSArray *)testInvocations 
+{
+    SEL selector = @selector(buildExampleGroups);
+
+    // Only return invocation if the receiver is a concrete spec that has overridden -buildExampleGroups.
+    if ([self methodForSelector:selector] == [KWSpec methodForSelector:selector])
+        return nil;
+
+    KWExampleSuite *exampleSuite = [[KWExampleGroupBuilder sharedExampleGroupBuilder] buildExampleGroups:^{
+        [self buildExampleGroups];
+    }];
+  
+    return [exampleSuite invocationsForTestCase];
+}
+
+#pragma mark -
+#pragma mark Running Specs
+
+- (void)invokeTest 
+{
+    self.example = [[self invocation] kw_example];
+
+    NSAutoreleasePool *subPool = [[NSAutoreleasePool alloc] init];
+
+    @try {
+        [self.example runWithDelegate:self];
+    } @catch (NSException *exception) {
+        [self failWithException:exception];
+    }
+    
+    [[self invocation] kw_setExample:nil];
+    
+    [subPool release];
+}
+
+#pragma mark - KWExampleGroupDelegate methods
+
+- (void)example:(KWExample *)example didFailWithFailure:(KWFailure *)failure
+{
+    [self failWithException:[failure exceptionValue]];
+}
+
+#pragma mark -
+#pragma mark Verification proxies
+
++ (id)addVerifier:(id<KWVerifying>)aVerifier
+{
+  return [[[KWExampleGroupBuilder sharedExampleGroupBuilder] currentExample] addVerifier:aVerifier];
+}
+
++ (id)addExistVerifierWithExpectationType:(KWExpectationType)anExpectationType callSite:(KWCallSite *)aCallSite
+{
+  return [[[KWExampleGroupBuilder sharedExampleGroupBuilder] currentExample] addExistVerifierWithExpectationType:anExpectationType callSite:aCallSite];
+}
+
++ (id)addMatchVerifierWithExpectationType:(KWExpectationType)anExpectationType callSite:(KWCallSite *)aCallSite
+{
+  return [[[KWExampleGroupBuilder sharedExampleGroupBuilder] currentExample] addMatchVerifierWithExpectationType:anExpectationType callSite:aCallSite];
+}
+
++ (id)addAsyncVerifierWithExpectationType:(KWExpectationType)anExpectationType callSite:(KWCallSite *)aCallSite timeout:(NSInteger)timeout
+{
+  return [[[KWExampleGroupBuilder sharedExampleGroupBuilder] currentExample] addAsyncVerifierWithExpectationType:anExpectationType callSite:aCallSite timeout:timeout];
+}
+
+@end
Pods/Kiwi/Classes/KWStringContainsMatcher.h
@@ -0,0 +1,21 @@
+//
+//  KWStringContainsMatcher.h
+//  Kiwi
+//
+//  Created by Stewart Gleadow on 7/06/12.
+//  Copyright (c) 2012 Allen Ding. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+@interface KWStringContainsMatcher : NSObject {
+  NSString *substring;
+}
+
++ (id)matcherWithSubstring:(NSString *)aSubstring;
+- (id)initWithSubstring:(NSString *)aSubstring;
+- (BOOL)matches:(id)object;
+
+@end
+
+#define hasSubstring(substring) [KWStringContainsMatcher matcherWithSubstring:substring]
Pods/Kiwi/Classes/KWStringContainsMatcher.m
@@ -0,0 +1,45 @@
+//
+//  StringContainsMatcher.m
+//  Kiwi
+//
+//  Created by Stewart Gleadow on 7/06/12.
+//  Copyright (c) 2012 Allen Ding. All rights reserved.
+//
+
+#import "KWStringContainsMatcher.h"
+
+@implementation KWStringContainsMatcher
+
++ (id)matcherWithSubstring:(NSString *)aSubstring;
+{
+  return [[[self alloc] initWithSubstring:aSubstring] autorelease];
+}
+
+- (id)initWithSubstring:(NSString *)aSubstring;
+{
+  if ((self = [super init])) {
+    substring = [aSubstring copy];
+  }
+  return self;
+}
+
+- (void)dealloc
+{
+  [substring release];
+  [super dealloc];
+}
+
+- (BOOL)matches:(id)item
+{
+  if (![item respondsToSelector:@selector(rangeOfString:)])
+    return NO;
+  
+  return [item rangeOfString:substring].location != NSNotFound;
+}
+
+- (NSString *)description
+{
+  return [NSString stringWithFormat:@"a string with substring '%@'", substring];
+}
+
+@end
Pods/Kiwi/Classes/KWStringPrefixMatcher.h
@@ -0,0 +1,18 @@
+//
+//  StringPrefixMatcher.h
+//  Kiwi
+//
+//  Created by Luke Redpath on 17/01/2011.
+//  Copyright 2011 Allen Ding. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+@interface KWStringPrefixMatcher : NSObject {
+  NSString *prefix;
+}
++ (id)matcherWithPrefix:(NSString *)aPrefix;
+- (id)initWithPrefix:(NSString *)aPrefix;
+@end
+
+#define hasPrefix(prefix) [KWStringPrefixMatcher matcherWithPrefix:prefix]
Pods/Kiwi/Classes/KWStringPrefixMatcher.m
@@ -0,0 +1,46 @@
+//
+//  StringPrefixMatcher.m
+//  Kiwi
+//
+//  Created by Luke Redpath on 17/01/2011.
+//  Copyright 2011 Allen Ding. All rights reserved.
+//
+
+#import "KWStringPrefixMatcher.h"
+
+
+@implementation KWStringPrefixMatcher
+
++ (id)matcherWithPrefix:(NSString *)aPrefix;
+{
+  return [[[self alloc] initWithPrefix:aPrefix] autorelease];
+}
+
+- (id)initWithPrefix:(NSString *)aPrefix;
+{
+  if ((self = [super init])) {
+    prefix = [aPrefix copy];
+  }
+  return self;
+}
+
+- (void)dealloc
+{
+  [prefix release];
+  [super dealloc];
+}
+
+- (BOOL)matches:(id)item
+{
+  if (![item respondsToSelector:@selector(hasPrefix:)])
+    return NO;
+
+  return [item hasPrefix:prefix];
+}
+
+- (NSString *)description
+{
+  return [NSString stringWithFormat:@"a string with prefix '%@'", prefix];
+}
+
+@end
Pods/Kiwi/Classes/KWStringUtilities.h
@@ -0,0 +1,20 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+
+#pragma mark -
+#pragma mark Checking for Case Separated Words
+
+BOOL KWStringHasWordPrefix(NSString *string, NSString *prefix);
+BOOL KWStringHasStrictWordPrefix(NSString *string, NSString *prefix);
+BOOL KWStringHasWord(NSString *string, NSString *word);
+
+#pragma mark -
+#pragma mark Getting Type Encodings
+
+NSString *KWEncodingWithObjCTypes(const char *firstType, ...) NS_REQUIRES_NIL_TERMINATION;
+NSString *KWEncodingForVoidMethod(void);
Pods/Kiwi/Classes/KWStringUtilities.m
@@ -0,0 +1,90 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWStringUtilities.h"
+
+#pragma mark -
+#pragma mark Checking for Case Separated Words
+
+BOOL KWStringHasWordPrefix(NSString *string, NSString *prefix) {
+    return [string isEqualToString:prefix] || KWStringHasStrictWordPrefix(string, prefix);
+}
+
+BOOL KWStringHasStrictWordPrefix(NSString *string, NSString *prefix) {
+    if (![string hasPrefix:prefix] || [string length] == [prefix length])
+        return NO;
+
+    unichar firstCharacterAfterPrefix = [string characterAtIndex:[prefix length]];
+    NSCharacterSet *uppercaseCharacterSet = [NSCharacterSet uppercaseLetterCharacterSet];
+    return [uppercaseCharacterSet characterIsMember:firstCharacterAfterPrefix];
+}
+
+BOOL KWStringHasWord(NSString *string, NSString *word) {
+    if (KWStringHasWordPrefix(string, word))
+        return YES;
+
+    NSCharacterSet *lowercaseCharacterSet = [NSCharacterSet lowercaseLetterCharacterSet];
+    NSCharacterSet *uppercaseCharacterSet = [NSCharacterSet uppercaseLetterCharacterSet];
+    NSRange searchRange = NSMakeRange(0, [string length]);
+
+    // Never match if word begins with a lowercase letter and was not a prefix.
+    if ([lowercaseCharacterSet characterIsMember:[word characterAtIndex:0]])
+        return NO;
+
+    while (1) {
+        if (searchRange.location >= [string length])
+            return NO;
+
+        NSRange range = [string rangeOfString:word options:0 range:searchRange];
+        searchRange.location = range.location + range.length;
+        searchRange.length = [string length] - searchRange.location;
+
+        if (range.location == NSNotFound)
+            return NO;
+
+        if (range.location > 0) {
+            unichar charBeforeRange = [string characterAtIndex:range.location - 1];
+
+
+            if (![lowercaseCharacterSet characterIsMember:charBeforeRange])
+                continue;
+        }
+
+        if (range.location + range.length < [string length]) {
+            unichar charAfterRange = [string characterAtIndex:range.location + range.length];
+
+            if (![uppercaseCharacterSet characterIsMember:charAfterRange])
+                continue;
+        }
+
+        return YES;
+    }
+}
+
+#pragma mark -
+#pragma mark Getting Type Encodings
+
+NSString *KWEncodingWithObjCTypes(const char *firstType, ...) {
+    if (firstType == nil)
+        return nil;
+
+    NSMutableString *encoding = [NSMutableString stringWithCapacity:8];
+    va_list argumentList;
+    va_start(argumentList, firstType);
+    const char *type = firstType;
+
+    do {
+        [encoding appendFormat:@"%s", type];
+        type = va_arg(argumentList, const char *);
+    } while (type != nil);
+
+    va_end(argumentList);
+    return encoding;
+}
+
+NSString *KWEncodingForVoidMethod(void) {
+    return KWEncodingWithObjCTypes(@encode(void), @encode(id), @encode(SEL), nil);
+}
Pods/Kiwi/Classes/KWStub.h
@@ -0,0 +1,48 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+
+@class KWMessagePattern;
+
+@interface KWStub : NSObject {
+@private
+    KWMessagePattern *messagePattern;
+    id value;
+    id returnValueTimes;
+    int returnedValueTimes;
+    id secondValue;
+	id (^block)(NSArray *params);
+}
+
+#pragma mark -
+#pragma mark Initializing
+
+- (id)initWithMessagePattern:(KWMessagePattern *)aMessagePattern;
+- (id)initWithMessagePattern:(KWMessagePattern *)aMessagePattern value:(id)aValue;
+- (id)initWithMessagePattern:(KWMessagePattern *)aMessagePattern block:(id (^)(NSArray *params))aBlock;
+- (id)initWithMessagePattern:(KWMessagePattern *)aMessagePattern value:(id)aValue times:(id)times afterThatReturn:(id)aSecondValue;
+
++ (id)stubWithMessagePattern:(KWMessagePattern *)aMessagePattern;
++ (id)stubWithMessagePattern:(KWMessagePattern *)aMessagePattern value:(id)aValue;
++ (id)stubWithMessagePattern:(KWMessagePattern *)aMessagePattern block:(id (^)(NSArray *params))aBlock;
++ (id)stubWithMessagePattern:(KWMessagePattern *)aMessagePattern value:(id)aValue times:(id)times afterThatReturn:(id)aSecondValue;
+
+#pragma mark -
+#pragma mark Properties
+
+@property (nonatomic, readonly) KWMessagePattern *messagePattern;
+@property (nonatomic, readonly) id value;
+@property (nonatomic, readonly) id returnValueTimes;
+@property (nonatomic, readonly) int returnedValueTimes;
+@property (nonatomic, readonly) id secondValue;
+
+#pragma mark -
+#pragma mark Processing Invocations
+
+- (BOOL)processInvocation:(NSInvocation *)anInvocation;
+
+@end
Pods/Kiwi/Classes/KWStub.m
@@ -0,0 +1,221 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWStub.h"
+#import "KWMessagePattern.h"
+#import "KWObjCUtilities.h"
+#import "KWStringUtilities.h"
+#import "KWValue.h"
+
+#import "NSInvocation+OCMAdditions.h"
+
+@implementation KWStub
+
+#pragma mark -
+#pragma mark Initializing
+
+- (id)initWithMessagePattern:(KWMessagePattern *)aMessagePattern {
+    return [self initWithMessagePattern:aMessagePattern value:nil];
+}
+
+- (id)initWithMessagePattern:(KWMessagePattern *)aMessagePattern value:(id)aValue {
+    if ((self = [super init])) {
+        messagePattern = [aMessagePattern retain];
+        value = [aValue retain];
+    }
+
+    return self;
+}
+
+- (id)initWithMessagePattern:(KWMessagePattern *)aMessagePattern block:(id (^)(NSArray *params))aBlock {
+    if ((self = [super init])) {
+        messagePattern = [aMessagePattern retain];
+        block = [aBlock copy];
+    }
+	
+    return self;
+}
+
+- (id)initWithMessagePattern:(KWMessagePattern *)aMessagePattern value:(id)aValue times:(id)times afterThatReturn:(id)aSecondValue {
+    if ((self = [super init])) {
+        messagePattern = [aMessagePattern retain];
+        value = [aValue retain];
+        returnValueTimes = [times retain];
+        secondValue = [aSecondValue retain];
+    }
+    
+    return self;
+}
+
++ (id)stubWithMessagePattern:(KWMessagePattern *)aMessagePattern {
+    return [self stubWithMessagePattern:aMessagePattern value:nil];
+}
+
++ (id)stubWithMessagePattern:(KWMessagePattern *)aMessagePattern value:(id)aValue {
+    return [[[self alloc] initWithMessagePattern:aMessagePattern value:aValue] autorelease];
+}
+
++ (id)stubWithMessagePattern:(KWMessagePattern *)aMessagePattern block:(id (^)(NSArray *params))aBlock {
+    return [[[self alloc] initWithMessagePattern:aMessagePattern block:aBlock] autorelease];
+}
+
++ (id)stubWithMessagePattern:(KWMessagePattern *)aMessagePattern value:(id)aValue times:(id)times afterThatReturn:(id)aSecondValue {
+    return [[[self alloc] initWithMessagePattern:aMessagePattern value:aValue times:times afterThatReturn:aSecondValue] autorelease];
+}
+
+- (void)dealloc {
+    [messagePattern release];
+    [value release];
+    [returnValueTimes release];
+    [secondValue release];
+	[block release];
+    [super dealloc];
+}
+
+#pragma mark -
+#pragma mark Properties
+
+@synthesize messagePattern;
+@synthesize value;
+@synthesize secondValue;
+@synthesize returnValueTimes;
+@synthesize returnedValueTimes;
+
+#pragma mark -
+#pragma mark Processing Invocations
+
+- (void)writeZerosToInvocationReturnValue:(NSInvocation *)anInvocation {
+    NSUInteger returnLength = [[anInvocation methodSignature] methodReturnLength];
+
+    if (returnLength == 0)
+        return;
+
+    void *bytes = malloc(returnLength);
+    memset(bytes, 0, returnLength);
+    [anInvocation setReturnValue:bytes];
+    free(bytes);
+}
+
+- (NSData *)valueDataWithObjCType:(const char *)objCType {
+    assert(self.value && "self.value must not be nil");
+    NSData *data = [self.value dataForObjCType:objCType];
+
+    if (data == nil) {
+        [NSException raise:@"KWStubException" format:@"wrapped stub value type (%s) could not be converted to the target type (%s)",
+                                                     [self.value objCType],
+                                                     objCType];
+    }
+
+    return data;
+}
+
+- (void)writeWrappedValueToInvocationReturnValue:(NSInvocation *)anInvocation {
+    assert(self.value && "self.value must not be nil");
+    const char *returnType = [[anInvocation methodSignature] methodReturnType];
+    NSData *data = nil;
+
+    NSData *choosedForData = [self.value dataValue];
+
+    if (returnValueTimes != nil) {
+        NSString *returnValueTimesString = returnValueTimes;
+        int returnValueTimesInt = [returnValueTimesString intValue];
+        
+        if (returnedValueTimes >= returnValueTimesInt) {
+            choosedForData = [self.secondValue dataValue];
+        }
+        returnedValueTimes++;
+    }
+
+    
+    // When the return type is not the same as the type of the wrapped value,
+    // attempt to convert the wrapped value to the desired type.
+
+    if (KWObjCTypeEqualToObjCType([self.value objCType], returnType))
+        data = choosedForData;
+    else
+        data = [self valueDataWithObjCType:returnType];
+
+    [anInvocation setReturnValue:(void *)[data bytes]];
+}
+
+- (void)writeObjectValueToInvocationReturnValue:(NSInvocation *)anInvocation {
+    assert(self.value && "self.value must not be nil");
+    
+    void *choosedForData = &value;
+    
+    if (returnValueTimes != nil) {
+        NSString *returnValueTimesString = returnValueTimes;
+        int returnValueTimesInt = [returnValueTimesString intValue];
+        
+        if (returnedValueTimes >= returnValueTimesInt) {
+            choosedForData = &secondValue;
+        }
+        returnedValueTimes++;
+    }
+
+    [anInvocation setReturnValue:choosedForData];
+
+#ifndef __clang_analyzer__
+    NSString *selectorString = NSStringFromSelector([anInvocation selector]);
+
+    // To conform to memory management conventions, retain if writing a result
+    // that begins with alloc, new or contains copy. This shows up as a false
+    // positive in clang due to the runtime conditional, so ignore it.
+    if (KWStringHasWordPrefix(selectorString, @"alloc") ||
+        KWStringHasWordPrefix(selectorString, @"new") ||
+        KWStringHasWord(selectorString, @"copy") ||
+        KWStringHasWord(selectorString, @"Copy")) {
+        [self.value retain];
+    }
+#endif
+}
+
+- (BOOL)processInvocation:(NSInvocation *)anInvocation {
+    if (![self.messagePattern matchesInvocation:anInvocation])
+        return NO;
+	
+	if (block) {
+		NSUInteger numberOfArguments = [[anInvocation methodSignature] numberOfArguments];
+		NSMutableArray *args = [NSMutableArray arrayWithCapacity:(numberOfArguments-2)];
+		for (NSUInteger i = 2; i < numberOfArguments; ++i) {
+			id arg = [anInvocation getArgumentAtIndexAsObject:i];
+			
+			const char *argType = [[anInvocation methodSignature] getArgumentTypeAtIndex:i];
+			if (strcmp(argType, "@?") == 0) arg = [[arg copy] autorelease];
+            
+            if (arg == nil)
+                arg = [NSNull null];
+            
+			[args addObject:arg];
+		}
+		
+		id newValue = block(args);
+		if (newValue != value) {
+			[value release];
+			value = [newValue retain];
+		}
+		
+		[args removeAllObjects]; // We don't want these objects to be in autorelease pool
+	}
+
+    if (self.value == nil)
+        [self writeZerosToInvocationReturnValue:anInvocation];
+    else if ([self.value isKindOfClass:[KWValue class]])
+        [self writeWrappedValueToInvocationReturnValue:anInvocation];
+    else
+        [self writeObjectValueToInvocationReturnValue:anInvocation];
+
+    return YES;
+}
+
+#pragma mark -
+#pragma mark Debugging
+
+- (NSString *)description {
+    return [NSString stringWithFormat:@"messagePattern: %@\nvalue: %@", self.messagePattern, self.value];
+}
+
+@end
Pods/Kiwi/Classes/KWTestCase.h
@@ -0,0 +1,45 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+#import <SenTestingKit/SenTestingKit.h>
+#import "KWExpectationType.h"
+#import "KWReporting.h"
+
+@class KWCallSite;
+@class KWMatcherFactory;
+
+@protocol KWVerifying;
+
+// Deprecated. This is here just in case blocks are not enabled.
+@interface KWTestCase : SenTestCase<KWReporting> {
+@private
+    KWMatcherFactory *matcherFactory;
+    NSMutableArray *verifiers;
+    NSMutableArray *failures;
+}
+
+#pragma mark -
+#pragma mark Configuring Example Environments
+
+- (void)setUpExampleEnvironment;
+- (void)tearDownExampleEnvironment;
+
+#pragma mark -
+#pragma mark Marking Pending Examples
+
+- (void)markPendingWithCallSite:(KWCallSite *)aCallSite;
+- (void)markPendingWithCallSite:(KWCallSite *)aCallSite :(NSString *)aDescription;
+
+#pragma mark -
+#pragma mark Adding Verifiers
+
+- (id)addVerifier:(id<KWVerifying>)aVerifier;
+- (id)addExistVerifierWithExpectationType:(KWExpectationType)anExpectationType callSite:(KWCallSite *)aCallSite;
+- (id)addMatchVerifierWithExpectationType:(KWExpectationType)anExpectationType callSite:(KWCallSite *)aCallSite;
+- (id)addAsyncVerifierWithExpectationType:(KWExpectationType)anExpectationType callSite:(KWCallSite *)aCallSite timeout:(NSInteger)timeout;
+
+@end
Pods/Kiwi/Classes/KWTestCase.m
@@ -0,0 +1,191 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWTestCase.h"
+#import <objc/runtime.h>
+#import "KWDeviceInfo.h"
+#import "KWExistVerifier.h"
+#import "KWFailure.h"
+#import "KWIntercept.h"
+#import "KWMatcherFactory.h"
+#import "KWMatchVerifier.h"
+#import "KWAsyncVerifier.h"
+#import "KWObjCUtilities.h"
+#import "KWStringUtilities.h"
+#import "KWVerifying.h"
+#import "NSMethodSignature+KiwiAdditions.h"
+
+@interface KWTestCase()
+
+#pragma mark -
+#pragma mark Properties
+
+@property (nonatomic, readonly) KWMatcherFactory *matcherFactory;
+@property (nonatomic, readonly) NSMutableArray *verifiers;
+@property (nonatomic, readonly) NSMutableArray *failures;
+@end
+
+@implementation KWTestCase
+
+#pragma mark -
+#pragma mark Initializing
+
+// Initializer used by the SenTestingKit test suite to initialize a test case
+// for each test invocation returned in +testInvocations.
+- (id)initWithInvocation:(NSInvocation *)anInvocation {
+    if ((self = [super initWithInvocation:anInvocation])) {
+        matcherFactory = [[KWMatcherFactory alloc] init];
+        verifiers = [[NSMutableArray alloc] init];
+        failures = [[NSMutableArray alloc] init];
+    }
+
+    return self;
+}
+
+- (void)dealloc {
+    [matcherFactory release];
+    [verifiers release];
+    [failures release];
+    [super dealloc];
+}
+
+#pragma mark -
+#pragma mark Properties
+
+@synthesize verifiers;
+@synthesize matcherFactory;
+@synthesize failures;
+
+#pragma mark -
+#pragma mark Configuring Example Environments
+
+- (void)setUpExampleEnvironment {
+    [self.matcherFactory registerMatcherClassesWithNamespacePrefix:@"KW"];
+}
+
+- (void)tearDownExampleEnvironment {
+    KWClearStubsAndSpies();
+}
+
+#pragma mark -
+#pragma mark Marking Pending Examples
+
+- (void)markPendingWithCallSite:(KWCallSite *)aCallSite {
+    KWFailure *failure = [KWFailure failureWithCallSite:aCallSite format:@"PENDING"];
+    [self reportFailure:failure];
+}
+
+- (void)markPendingWithCallSite:(KWCallSite *)aCallSite :(NSString *)aDescription {
+    KWFailure *failure = [KWFailure failureWithCallSite:aCallSite format:@"PENDING (%@)", aDescription];
+    [self reportFailure:failure];
+}
+
+#pragma mark -
+#pragma mark Adding Verifiers
+
+- (id)addVerifier:(id<KWVerifying>)aVerifier {
+    if (![self.verifiers containsObject:aVerifier])
+        [self.verifiers addObject:aVerifier];
+
+    return aVerifier;
+}
+
+- (id)addExistVerifierWithExpectationType:(KWExpectationType)anExpectationType callSite:(KWCallSite *)aCallSite {
+    id verifier = [KWExistVerifier existVerifierWithExpectationType:anExpectationType callSite:aCallSite reporter:self];
+    [self.verifiers addObject:verifier];
+    return verifier;
+}
+
+- (id)addMatchVerifierWithExpectationType:(KWExpectationType)anExpectationType callSite:(KWCallSite *)aCallSite {
+    id verifier = [KWMatchVerifier matchVerifierWithExpectationType:anExpectationType callSite:aCallSite matcherFactory:self.matcherFactory reporter:self];
+    [self.verifiers addObject:verifier];
+    return verifier;
+}
+
+- (id)addAsyncVerifierWithExpectationType:(KWExpectationType)anExpectationType callSite:(KWCallSite *)aCallSite timeout:(NSInteger)timeout {
+    id verifier = [KWAsyncVerifier asyncVerifierWithExpectationType:anExpectationType callSite:aCallSite matcherFactory:self.matcherFactory reporter:self probeTimeout:timeout];
+    [self.verifiers addObject:verifier];
+    return verifier;
+}
+
+#pragma mark -
+#pragma mark Reporting Failures
+
++ (KWFailure *)tidiedFailureWithFailure:(KWFailure *)aFailure {
+    if ([KWDeviceInfo isSimulator]) {
+        // \uff1a is the unicode for a fill width colon, as opposed to a
+        // regular :. This escape is performed so that Xcode doesn't truncate
+        // the error in the build results window, which is nice for build
+        // tests.
+        NSString *escapedMessage = [aFailure.message stringByReplacingOccurrencesOfString:@":" withString:@"\uff1a"];
+        return [KWFailure failureWithCallSite:aFailure.callSite message:escapedMessage];
+    } else {
+        return aFailure;
+    }
+}
+
+- (void)reportFailure:(KWFailure *)aFailure; {
+    [self.failures addObject:aFailure];
+    KWFailure *tidiedFailure = [[self class] tidiedFailureWithFailure:aFailure];
+    [self failWithException:[tidiedFailure exceptionValue]];
+}
+
+#pragma mark -
+#pragma mark Getting Invocations
+
+// Called by the SenTestingKit test suite to get an array of invocations that
+// should be run on instances of test cases.
++ (NSArray *)testInvocations {
+    // Examples are methods returning void with no parameters in the receiver
+    // that begin with "it" followed by an uppercase word.
+    NSMutableArray *exampleInvocations = [[[NSMutableArray alloc] init] autorelease];
+    unsigned int methodCount = 0;
+    Method *methods = class_copyMethodList([self class], &methodCount);
+
+    for (unsigned int i = 0; i < methodCount; i++) {
+        SEL selector = method_getName(methods[i]);
+        NSString *selectorString = NSStringFromSelector(selector);
+
+        if (KWStringHasStrictWordPrefix(selectorString, @"it")) {
+            const char *encoding = method_getTypeEncoding(methods[i]);
+            NSMethodSignature *signature = [NSMethodSignature signatureWithObjCTypes:encoding];
+
+            if ([signature numberOfMessageArguments] > 0 ||
+                !KWObjCTypeEqualToObjCType([signature methodReturnType], @encode(void)))
+                continue;
+
+            NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
+            [invocation setSelector:selector];
+            [exampleInvocations addObject:invocation];
+        }
+    }
+
+    free(methods);
+    return exampleInvocations;
+}
+
+#pragma mark -
+#pragma mark Running Test Cases
+
+// Called by the SenTestingKit test suite when it is time to run the test.
+- (void)invokeTest {
+    NSAutoreleasePool *subPool = [[NSAutoreleasePool alloc] init];
+    [self setUpExampleEnvironment];
+
+    @try {
+        [super invokeTest];
+
+        for (id<KWVerifying> verifier in self.verifiers)
+            [verifier exampleWillEnd];
+    } @catch (NSException *exception) {
+        [self failWithException:exception];
+    }
+
+    [self tearDownExampleEnvironment];
+    [subPool release];
+}
+
+@end
Pods/Kiwi/Classes/KWUserDefinedMatcher.h
@@ -0,0 +1,62 @@
+//
+//  KWUserDefinedMatcher.h
+//  Kiwi
+//
+//  Created by Luke Redpath on 16/06/2011.
+//  Copyright 2011 Allen Ding. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+#import "KWMatcher.h"
+
+typedef BOOL (^KWUserDefinedMatcherBlock)();
+
+@interface KWUserDefinedMatcher : KWMatcher
+{
+    KWUserDefinedMatcherBlock matcherBlock;
+    SEL selector;
+    NSInvocation *invocation;
+    NSString *failureMessageForShould;
+    NSString *failureMessageForShouldNot;
+}
+@property (nonatomic, assign) SEL selector;
+@property (nonatomic, copy) NSString *failureMessageForShould;
+@property (nonatomic, copy) NSString *failureMessageForShouldNot;
+@property (nonatomic, assign) KWUserDefinedMatcherBlock matcherBlock;
+@property (nonatomic, copy) NSString *description;
+
++ (id)matcherWithSubject:(id)aSubject block:(KWUserDefinedMatcherBlock)aBlock;
+- (id)initWithSubject:(id)aSubject block:(KWUserDefinedMatcherBlock)aBlock;
+- (void)setSubject:(id)aSubject;
+@end
+
+#pragma mark -
+
+typedef NSString * (^KWUserDefinedMatcherMessageBlock)(id);
+
+@interface KWUserDefinedMatcherBuilder : NSObject
+{
+    KWUserDefinedMatcher *matcher;
+    KWUserDefinedMatcherMessageBlock failureMessageForShouldBlock;
+    KWUserDefinedMatcherMessageBlock failureMessageForShouldNotBlock;
+    NSString *description;
+}
+@property (nonatomic, readonly) NSString *key;
+
++ (id)builder;
++ (id)builderForSelector:(SEL)aSelector;
+- (id)initWithSelector:(SEL)aSelector;
+
+#pragma mark -
+#pragma mark Configuring The Matcher
+
+- (void)match:(KWUserDefinedMatcherBlock)block;
+- (void)failureMessageForShould:(KWUserDefinedMatcherMessageBlock)block;
+- (void)failureMessageForShouldNot:(KWUserDefinedMatcherMessageBlock)block;
+- (void)description:(NSString *)description;
+
+#pragma mark -
+#pragma mark Buiding The Matcher
+
+- (KWUserDefinedMatcher *)buildMatcherWithSubject:(id)subject;
+@end
Pods/Kiwi/Classes/KWUserDefinedMatcher.m
@@ -0,0 +1,178 @@
+//
+//  KWUserDefinedMatcher.m
+//  Kiwi
+//
+//  Created by Luke Redpath on 16/06/2011.
+//  Copyright 2011 Allen Ding. All rights reserved.
+//
+
+#import "KWUserDefinedMatcher.h"
+
+@implementation KWUserDefinedMatcher
+
+@synthesize selector;
+@synthesize failureMessageForShould;
+@synthesize failureMessageForShouldNot;
+@synthesize matcherBlock;
+@synthesize description;
+
++ (id)matcherWithSubject:(id)aSubject block:(KWUserDefinedMatcherBlock)aBlock
+{
+    return [[[self alloc] initWithSubject:aSubject block:aBlock] autorelease];
+}
+
+- (id)initWithSubject:(id)aSubject block:(KWUserDefinedMatcherBlock)aBlock
+{
+    if ((self = [super initWithSubject:aSubject])) {
+        matcherBlock = [aBlock copy];
+        self.description = @"match user defined matcher";
+    }
+    return self;
+}
+
+- (void)dealloc
+{
+    [invocation release];
+    [matcherBlock release];
+    [super dealloc];
+}
+
+- (BOOL)evaluate
+{
+    BOOL result;
+
+    if (invocation.methodSignature.numberOfArguments == 3) {
+        id argument;
+        [invocation getArgument:&argument atIndex:2];
+        result = matcherBlock(self.subject, argument);
+    } else {
+        result = matcherBlock(self.subject);
+    }
+    return result;
+}
+
+- (void)setSubject:(id)aSubject {
+    if (aSubject != subject) {
+        [subject release];
+        subject = [aSubject retain];
+    }
+}
+
+#pragma mark -
+#pragma mark Message forwarding
+
+- (BOOL)respondsToSelector:(SEL)aSelector
+{
+    if (aSelector == self.selector) {
+        return YES;
+    }
+    return [super respondsToSelector:aSelector];
+}
+
+- (void)forwardInvocation:(NSInvocation *)anInvocation
+{
+    [invocation autorelease];
+    invocation = [anInvocation retain];
+}
+
+- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
+{
+    if (aSelector == self.selector) {
+        NSString *selectorString = NSStringFromSelector(self.selector);
+
+        /**
+         *   TODO: find a way of doing this that:
+         *   - doesn't require dummy methods (create the method signatures manually)
+         *   - supports an unlimited number of arguments
+         */
+        if ([selectorString hasSuffix:@":"]) {
+            return [self methodSignatureForSelector:@selector(matcherMethodWithArgument:)];
+        } else {
+            return [self methodSignatureForSelector:@selector(matcherMethodWithoutArguments)];
+        }
+    }
+    return [super methodSignatureForSelector:aSelector];
+}
+
+- (void)matcherMethodWithoutArguments {}
+- (void)matcherMethodWithArgument:(id)argument {}
+
+@end
+
+#pragma mark -
+
+@implementation KWUserDefinedMatcherBuilder
+
++ (id)builder
+{
+    return [self builderForSelector:nil];
+}
+
++ (id)builderForSelector:(SEL)aSelector {
+    return [[[self alloc] initWithSelector:aSelector] autorelease];
+}
+
+- (id)initWithSelector:(SEL)aSelector {
+    if ((self = [super init])) {
+        matcher = [[KWUserDefinedMatcher alloc] init];
+        matcher.selector = aSelector;
+    }
+    return self;
+}
+
+- (void)dealloc
+{
+    [matcher release];
+    [failureMessageForShouldBlock release];
+    [super dealloc];
+}
+
+- (NSString *)key {
+    return NSStringFromSelector(matcher.selector);
+}
+
+#pragma mark -
+#pragma mark Configuring The Matcher
+
+- (void)match:(KWUserDefinedMatcherBlock)block {
+    matcher.matcherBlock = block;
+}
+
+- (void)failureMessageForShould:(KWUserDefinedMatcherMessageBlock)block {
+    [failureMessageForShouldBlock release];
+    failureMessageForShouldBlock = [block copy];
+}
+
+- (void)failureMessageForShouldNot:(KWUserDefinedMatcherMessageBlock)block {
+    [failureMessageForShouldNotBlock release];
+    failureMessageForShouldNotBlock = [block copy];
+}
+
+- (void)description:(NSString *)aDescription
+{
+    [description release];
+    description = [aDescription copy];
+}
+
+#pragma mark -
+#pragma mark Buiding The Matcher
+
+- (KWUserDefinedMatcher *)buildMatcherWithSubject:(id)subject {
+    [matcher setSubject:subject];
+
+    if (failureMessageForShouldBlock) {
+        [matcher setFailureMessageForShould:failureMessageForShouldBlock(subject)];
+    }
+
+    if (failureMessageForShouldNotBlock) {
+        [matcher setFailureMessageForShouldNot:failureMessageForShouldNotBlock(subject)];
+    }
+
+    if (description) {
+        [matcher setDescription:description];
+    }
+
+    return matcher;
+}
+
+@end
Pods/Kiwi/Classes/KWValue.h
@@ -0,0 +1,97 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+
+@interface KWValue : NSObject {
+@private
+    const char *objCType;
+    id value;
+}
+
+#pragma mark -
+#pragma mark Initializing
+
+- (id)initWithBytes:(const void *)bytes objCType:(const char *)anObjCType;
+
++ (id)valueWithBytes:(const void *)bytes objCType:(const char *)anObjCType;
++ (id)valueWithBool:(BOOL)aValue;
++ (id)valueWithChar:(char)aValue;
++ (id)valueWithDouble:(double)aValue;
++ (id)valueWithFloat:(float)aValue;
++ (id)valueWithInt:(int)aValue;
++ (id)valueWithInteger:(NSInteger)aValue;
++ (id)valueWithLong:(long)aValue;
++ (id)valueWithLongLong:(long long)value;
++ (id)valueWithShort:(short)aValue;
++ (id)valueWithUnsignedChar:(unsigned char)aValue;
++ (id)valueWithUnsignedInt:(unsigned int)aValue;
++ (id)valueWithUnsignedInteger:(NSUInteger)aValue;
++ (id)valueWithUnsignedLong:(unsigned long)aValue;
++ (id)valueWithUnsignedLongLong:(unsigned long long)aValue;
++ (id)valueWithUnsignedShort:(unsigned short)aValue;
+
+#pragma mark -
+#pragma mark Properties
+
+@property (nonatomic, readonly) const char *objCType;
+@property (nonatomic, readonly) BOOL isNumeric;
+
+#pragma mark -
+#pragma mark Accessing Numeric Values
+
+- (NSNumber *)numberValue;
+- (BOOL)boolValue;
+- (char)charValue;
+- (double)doubleValue;
+- (float)floatValue;
+- (int)intValue;
+- (NSInteger)integerValue;
+- (long)longValue;
+- (long long)longLongValue;
+- (short)shortValue;
+- (unsigned char)unsignedCharValue;
+- (unsigned int)unsignedIntValue;
+- (NSUInteger)unsignedIntegerValue;
+- (unsigned long)unsignedLongValue;
+- (unsigned long long)unsignedLongLongValue;
+- (unsigned short)unsignedShortValue;
+
+#pragma mark -
+#pragma mark Accessing Data
+
+- (NSData *)dataValue;
+- (void)getValue:(void *)buffer;
+
+#pragma mark -
+#pragma mark Accessing Numeric Data
+
+- (NSData *)dataForObjCType:(const char *)anObjCType;
+- (NSData *)boolData;
+- (NSData *)charData;
+- (NSData *)doubleData;
+- (NSData *)floatData;
+- (NSData *)intData;
+- (NSData *)integerData;
+- (NSData *)longData;
+- (NSData *)longLongData;
+- (NSData *)shortData;
+- (NSData *)unsignedCharData;
+- (NSData *)unsignedIntData;
+- (NSData *)unsignedIntegerData;
+- (NSData *)unsignedLongData;
+- (NSData *)unsignedLongLongData;
+- (NSData *)unsignedShortData;
+
+#pragma mark -
+#pragma mark Comparing Values
+
+- (NSComparisonResult)compare:(KWValue *)aValue;
+
+- (BOOL)isEqualToKWValue:(KWValue *)aValue;
+- (BOOL)isEqualToNumber:(NSNumber *)aValue;
+
+@end
Pods/Kiwi/Classes/KWValue.m
@@ -0,0 +1,359 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWValue.h"
+#import "KWObjCUtilities.h"
+#import "NSNumber+KiwiAdditions.h"
+
+@interface KWValue()
+
+#pragma mark -
+#pragma mark Properties
+
+@property (nonatomic, readonly) id value;
+
+@end
+
+@implementation KWValue
+
+#pragma mark -
+#pragma mark Initializing
+
+- (id)initWithBytes:(const void *)bytes objCType:(const char *)anObjCType {
+    if ((self = [super init])) {
+        objCType = anObjCType;
+        value = [[NSValue alloc] initWithBytes:bytes objCType:anObjCType];
+    }
+
+    return self;
+}
+
++ (id)valueWithBytes:(const void *)bytes objCType:(const char *)type {
+    return [[[self alloc] initWithBytes:bytes objCType:type] autorelease];
+}
+
++ (id)valueWithBool:(BOOL)aValue {
+    return [self valueWithBytes:&aValue objCType:@encode(BOOL)];
+}
+
++ (id)valueWithChar:(char)aValue {
+    return [self valueWithBytes:&aValue objCType:@encode(char)];
+}
+
++ (id)valueWithDouble:(double)aValue {
+    return [self valueWithBytes:&aValue objCType:@encode(double)];
+}
+
++ (id)valueWithFloat:(float)aValue {
+    return [self valueWithBytes:&aValue objCType:@encode(float)];
+}
+
++ (id)valueWithInt:(int)aValue {
+    return [self valueWithBytes:&aValue objCType:@encode(int)];
+}
+
++ (id)valueWithInteger:(NSInteger)aValue {
+    return [self valueWithBytes:&aValue objCType:@encode(NSInteger)];
+}
+
++ (id)valueWithLong:(long)aValue {
+    return [self valueWithBytes:&aValue objCType:@encode(long)];
+}
+
++ (id)valueWithLongLong:(long long)value {
+    return [self valueWithBytes:&value objCType:@encode(long long)];
+}
+
++ (id)valueWithShort:(short)aValue {
+    return [self valueWithBytes:&aValue objCType:@encode(short)];
+}
+
++ (id)valueWithUnsignedChar:(unsigned char)aValue {
+    return [self valueWithBytes:&aValue objCType:@encode(unsigned char)];
+}
+
++ (id)valueWithUnsignedInt:(unsigned int)aValue {
+    return [self valueWithBytes:&aValue objCType:@encode(unsigned int)];
+}
+
++ (id)valueWithUnsignedInteger:(NSUInteger)aValue {
+    return [self valueWithBytes:&aValue objCType:@encode(NSUInteger)];
+}
+
++ (id)valueWithUnsignedLong:(unsigned long)aValue {
+    return [self valueWithBytes:&aValue objCType:@encode(unsigned long)];
+}
+
++ (id)valueWithUnsignedLongLong:(unsigned long long)aValue {
+    return [self valueWithBytes:&aValue objCType:@encode(long long)];
+}
+
++ (id)valueWithUnsignedShort:(unsigned short)aValue {
+    return [self valueWithBytes:&aValue objCType:@encode(unsigned short)];
+}
+
+- (void)dealloc {
+    [value release];
+    [super dealloc];
+}
+
+#pragma mark -
+#pragma mark Properties
+
+@synthesize objCType;
+
+- (BOOL)isNumeric {
+    return KWObjCTypeIsNumeric(self.objCType);
+}
+
+@synthesize value;
+
+#pragma mark -
+#pragma mark Accessing Numeric Values
+
+- (NSNumber *)numberValue {
+    if (!KWObjCTypeIsNumeric(self.objCType))
+        [NSException raise:NSInternalInconsistencyException format:@"cannot return number value because wrapped value is non-numeric"];
+
+    NSData *data = [self dataValue];
+    return [NSNumber numberWithBytes:[data bytes] objCType:self.objCType];
+}
+
+- (BOOL)boolValue {
+    return [[self numberValue] boolValue];
+}
+
+- (char)charValue {
+    return [[self numberValue] charValue];
+}
+
+- (double)doubleValue {
+    return [[self numberValue] doubleValue];
+}
+
+- (float)floatValue {
+    return [[self numberValue] floatValue];
+}
+
+- (int)intValue {
+    return [[self numberValue] intValue];
+}
+
+- (NSInteger)integerValue {
+    return [[self numberValue] integerValue];
+}
+
+- (long)longValue {
+    return [[self numberValue] longValue];
+}
+
+- (long long)longLongValue {
+    return [[self numberValue] longLongValue];
+}
+- (short)shortValue {
+    return [[self numberValue] shortValue];
+}
+
+- (unsigned char)unsignedCharValue {
+    return [[self numberValue] unsignedCharValue];
+}
+
+- (unsigned int)unsignedIntValue {
+    return [[self numberValue] unsignedIntValue];
+}
+
+- (NSUInteger)unsignedIntegerValue {
+    return [[self numberValue] unsignedIntegerValue];
+}
+
+- (unsigned long)unsignedLongValue {
+    return [[self numberValue] unsignedLongValue];
+}
+
+- (unsigned long long)unsignedLongLongValue {
+    return [[self numberValue] unsignedLongLongValue];
+}
+
+- (unsigned short)unsignedShortValue {
+    return [[self numberValue] unsignedShortValue];
+}
+
+#pragma mark -
+#pragma mark Accessing Data
+
+- (NSData *)dataValue {
+    NSUInteger length = KWObjCTypeLength(self.objCType);
+    void *buffer = malloc(length);
+    [self.value getValue:buffer];
+    NSData *data = [NSData dataWithBytes:buffer length:length];
+    free(buffer);
+    return data;
+}
+
+- (void)getValue:(void *)buffer {
+    [self.value getValue:buffer];
+}
+
+#pragma mark -
+#pragma mark Accessing Numeric Data
+
+- (NSData *)dataForObjCType:(const char *)anObjCType {
+    // Yeah, this is ugly.
+    if (KWObjCTypeEqualToObjCType(anObjCType, @encode(BOOL)))
+        return [self boolData];
+    else if (KWObjCTypeEqualToObjCType(anObjCType, @encode(char)))
+        return [self charData];
+    else if (KWObjCTypeEqualToObjCType(anObjCType, @encode(double)))
+        return [self doubleData];
+    else if (KWObjCTypeEqualToObjCType(anObjCType, @encode(float)))
+        return [self floatData];
+    else if (KWObjCTypeEqualToObjCType(anObjCType, @encode(int)))
+        return [self intData];
+    else if (KWObjCTypeEqualToObjCType(anObjCType, @encode(NSInteger)))
+        return [self integerData];
+    else if (KWObjCTypeEqualToObjCType(anObjCType, @encode(long)))
+        return [self longData];
+    else if (KWObjCTypeEqualToObjCType(anObjCType, @encode(long long)))
+        return [self longLongData];
+    else if (KWObjCTypeEqualToObjCType(anObjCType, @encode(short)))
+        return [self shortData];
+    else if (KWObjCTypeEqualToObjCType(anObjCType, @encode(unsigned char)))
+        return [self unsignedCharData];
+    else if (KWObjCTypeEqualToObjCType(anObjCType, @encode(unsigned int)))
+        return [self unsignedIntData];
+    else if (KWObjCTypeEqualToObjCType(anObjCType, @encode(NSUInteger)))
+        return [self unsignedIntegerData];
+    else if (KWObjCTypeEqualToObjCType(anObjCType, @encode(unsigned long)))
+        return [self unsignedLongData];
+    else if (KWObjCTypeEqualToObjCType(anObjCType, @encode(unsigned long long)))
+        return [self unsignedLongLongData];
+    else if (KWObjCTypeEqualToObjCType(anObjCType, @encode(unsigned short)))
+        return [self unsignedShortData];
+    else
+        return nil;
+}
+
+- (NSData *)boolData {
+    BOOL aValue = [self boolValue];
+    return [NSData dataWithBytes:&aValue length:sizeof(BOOL)];
+}
+
+- (NSData *)charData {
+    char aValue = [self charValue];
+    return [NSData dataWithBytes:&aValue length:sizeof(char)];
+}
+
+- (NSData *)doubleData {
+    double aValue = [self doubleValue];
+    return [NSData dataWithBytes:&aValue length:sizeof(double)];
+}
+
+- (NSData *)floatData {
+    float aValue = [self floatValue];
+    return [NSData dataWithBytes:&aValue length:sizeof(float)];
+}
+
+- (NSData *)intData {
+    int aValue = [self intValue];
+    return [NSData dataWithBytes:&aValue length:sizeof(int)];
+}
+
+- (NSData *)integerData {
+    NSInteger aValue = [self integerValue];
+    return [NSData dataWithBytes:&aValue length:sizeof(NSInteger)];
+}
+
+- (NSData *)longData {
+    long aValue = [self longValue];
+    return [NSData dataWithBytes:&aValue length:sizeof(long)];
+}
+
+- (NSData *)longLongData {
+    long long aValue = [self longLongValue];
+    return [NSData dataWithBytes:&aValue length:sizeof(long long)];
+}
+
+- (NSData *)shortData {
+    short aValue = [self shortValue];
+    return [NSData dataWithBytes:&aValue length:sizeof(short)];
+}
+
+- (NSData *)unsignedCharData {
+    unsigned char aValue = [self unsignedCharValue];
+    return [NSData dataWithBytes:&aValue length:sizeof(unsigned char)];
+}
+
+- (NSData *)unsignedIntData {
+    unsigned int aValue = [self unsignedIntValue];
+    return [NSData dataWithBytes:&aValue length:sizeof(unsigned int)];
+}
+
+- (NSData *)unsignedIntegerData {
+    NSUInteger aValue = [self unsignedIntegerValue];
+    return [NSData dataWithBytes:&aValue length:sizeof(NSUInteger)];
+}
+
+- (NSData *)unsignedLongData {
+    unsigned long aValue = [self unsignedLongValue];
+    return [NSData dataWithBytes:&aValue length:sizeof(unsigned long)];
+}
+
+- (NSData *)unsignedLongLongData {
+    unsigned long long aValue = [self unsignedLongLongValue];
+    return [NSData dataWithBytes:&aValue length:sizeof(unsigned long long)];
+}
+
+- (NSData *)unsignedShortData {
+    unsigned short aValue = [self unsignedShortValue];
+    return [NSData dataWithBytes:&aValue length:sizeof(unsigned short)];
+}
+
+#pragma mark -
+#pragma mark Comparing Objects
+
+- (NSUInteger)hash {
+    if (self.isNumeric)
+        return [[self numberValue] hash];
+
+    return [self.value hash];
+}
+
+- (NSComparisonResult)compare:(KWValue *)aValue {
+    return [[self numberValue] compare:[aValue numberValue]];
+}
+
+- (BOOL)isEqual:(id)object {
+    if ([object isKindOfClass:[KWValue class]])
+        return [self isEqualToKWValue:object];
+
+    if ([object isKindOfClass:[NSNumber class]])
+      return [self isEqualToNumber:object];
+
+    return NO;
+}
+
+- (BOOL)isEqualToKWValue:(KWValue *)aValue {
+    if (self.isNumeric && aValue.isNumeric)
+        return [self isEqualToNumber:[aValue numberValue]];
+    else
+        return [self.value isEqual:aValue.value];
+}
+
+- (BOOL)isEqualToNumber:(NSNumber *)aValue {
+    return [[self numberValue] isEqualToNumber:aValue];
+}
+
+#pragma mark -
+#pragma mark Representing Values
+
+- (NSString *)description {
+    if ([self isNumeric])
+        return [[self numberValue] description];
+
+    return [self.value description];
+}
+
+@end
Pods/Kiwi/Classes/KWVerifying.h
@@ -0,0 +1,23 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+
+@protocol KWVerifying<NSObject>
+
+- (NSString *)descriptionForAnonymousItNode;
+
+#pragma mark -
+#pragma mark Setting Subjects
+
+- (void)setSubject:(id)anObject;
+
+#pragma mark -
+#pragma mark Ending Examples
+
+- (void)exampleWillEnd;
+
+@end
Pods/Kiwi/Classes/KWWorkarounds.h
@@ -0,0 +1,18 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+
+#if KW_TARGET_HAS_INVOCATION_EXCEPTION_BUG
+
+#pragma mark -
+#pragma mark Invocation Exception Bug Workaround
+
+// See KiwiConfiguration.h for notes.
+void KWSetExceptionFromAcrossInvocationBoundary(NSException *anException);
+NSException *KWGetAndClearExceptionFromAcrossInvocationBoundary(void);
+
+#endif // #if KW_TARGET_HAS_INVOCATION_EXCEPTION_BUG
Pods/Kiwi/Classes/KWWorkarounds.m
@@ -0,0 +1,26 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KWWorkarounds.h"
+
+#if KW_TARGET_HAS_INVOCATION_EXCEPTION_BUG
+
+static NSException *KWExceptionAcrossInvokeBoundary = nil;
+
+void KWSetExceptionFromAcrossInvocationBoundary(NSException *anException) {
+    if (KWExceptionAcrossInvokeBoundary != nil)
+        return;
+
+    KWExceptionAcrossInvokeBoundary = [anException retain];
+}
+
+NSException *KWGetAndClearExceptionFromAcrossInvocationBoundary(void) {
+    NSException *exception = [KWExceptionAcrossInvokeBoundary autorelease];
+    KWExceptionAcrossInvokeBoundary = nil;
+    return exception;
+}
+
+#endif // #if KW_TARGET_HAS_INVOCATION_EXCEPTION_BUG
Pods/Kiwi/Classes/NSInvocation+KiwiAdditions.h
@@ -0,0 +1,28 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+
+@interface NSInvocation(KiwiAdditions)
+
+#pragma mark -
+#pragma mark Creating NSInvocation Objects
+
++ (NSInvocation *)invocationWithTarget:(id)anObject selector:(SEL)aSelector;
++ (NSInvocation *)invocationWithTarget:(id)anObject selector:(SEL)aSelector messageArguments:(const void *)firstBytes, ...;
+
+#pragma mark -
+#pragma mark Accessing Message Arguments
+
+// Message arguments are invocation arguments that begin after the target and selector arguments. These methods provide
+// convenient ways to access them.
+
+- (NSData *)messageArgumentDataAtIndex:(NSUInteger)anIndex;
+- (void)getMessageArgument:(void *)buffer atIndex:(NSUInteger)anIndex;
+- (void)setMessageArgument:(const void *)bytes atIndex:(NSUInteger)anIndex;
+- (void)setMessageArguments:(const void *)firstBytes, ...;
+
+@end
Pods/Kiwi/Classes/NSInvocation+KiwiAdditions.m
@@ -0,0 +1,93 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "NSInvocation+KiwiAdditions.h"
+#import "KWFormatter.h"
+#import "KWObjCUtilities.h"
+#import "NSMethodSignature+KiwiAdditions.h"
+
+@implementation NSInvocation(KiwiAdditions)
+
+#pragma mark -
+#pragma mark Creating NSInvocation Objects
+
++ (NSInvocation *)invocationWithTarget:(id)anObject selector:(SEL)aSelector {
+    return [self invocationWithTarget:anObject selector:aSelector messageArguments:nil];
+}
+
++ (NSInvocation *)invocationWithTarget:(id)anObject selector:(SEL)aSelector messageArguments:(const void *)firstBytes, ... {
+    if (anObject == nil) {
+        [NSException raise:NSInvalidArgumentException format:@"%@ - target must not be nil",
+                                                             NSStringFromSelector(_cmd)];
+    }
+
+    NSMethodSignature *signature = [anObject methodSignatureForSelector:aSelector];
+
+    if (signature == nil) {
+        [NSException raise:NSInvalidArgumentException format:@"%@ - target returned nil for -methodSignatureForSelector",
+                                                             NSStringFromSelector(_cmd)];
+    }
+
+    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
+    [invocation setTarget:anObject];
+    [invocation setSelector:aSelector];
+    NSUInteger numberOfMessageArguments = [signature numberOfMessageArguments];
+
+    if (numberOfMessageArguments == 0)
+        return invocation;
+
+    va_list argumentList;
+    va_start(argumentList, firstBytes);
+    const void *bytes = firstBytes;
+
+    for (NSUInteger i = 0; i < numberOfMessageArguments && bytes != nil; ++i) {
+        [invocation setMessageArgument:bytes atIndex:i];
+        bytes = va_arg(argumentList, const void *);
+    }
+
+    va_end(argumentList);
+    return invocation;
+}
+
+#pragma mark -
+#pragma mark Accessing Message Arguments
+
+- (NSData *)messageArgumentDataAtIndex:(NSUInteger)anIndex {
+    NSUInteger length =  KWObjCTypeLength([[self methodSignature] messageArgumentTypeAtIndex:anIndex]);
+    void *buffer = malloc(length);
+    [self getMessageArgument:buffer atIndex:anIndex];
+    // NSData takes over ownership of buffer
+    NSData* data = [NSData dataWithBytesNoCopy:buffer length:length];
+    return data;
+}
+
+- (void)getMessageArgument:(void *)buffer atIndex:(NSUInteger)anIndex {
+    [self getArgument:buffer atIndex:anIndex + 2];
+}
+
+- (void)setMessageArgument:(const void *)bytes atIndex:(NSUInteger)anIndex {
+    [self setArgument:(void *)bytes atIndex:anIndex + 2];
+}
+
+- (void)setMessageArguments:(const void *)firstBytes, ... {
+    NSUInteger numberOfMessageArguments = [[self methodSignature] numberOfMessageArguments];
+
+    if (numberOfMessageArguments == 0)
+        return;
+
+    va_list argumentList;
+    va_start(argumentList, firstBytes);
+    const void *bytes = firstBytes;
+
+    for (NSUInteger i = 0; i < numberOfMessageArguments && bytes != nil; ++i) {
+        [self setMessageArgument:bytes atIndex:i];
+        bytes = va_arg(argumentList, const void *);
+    }
+
+    va_end(argumentList);
+}
+
+@end
Pods/Kiwi/Classes/NSInvocation+OCMAdditions.h
@@ -0,0 +1,34 @@
+//---------------------------------------------------------------------------------------
+//  $Id$
+//  Copyright (c) 2006-2009 by Mulle Kybernetik. See License file for details.
+//---------------------------------------------------------------------------------------
+
+#import <Foundation/Foundation.h>
+
+@interface NSInvocation(OCMAdditions)
+
+- (id)getArgumentAtIndexAsObject:(int)argIndex;
+
+- (NSString *)invocationDescription;
+
+- (NSString *)argumentDescriptionAtIndex:(int)argIndex;
+
+- (NSString *)objectDescriptionAtIndex:(int)anInt;
+- (NSString *)charDescriptionAtIndex:(int)anInt;
+- (NSString *)unsignedCharDescriptionAtIndex:(int)anInt;
+- (NSString *)intDescriptionAtIndex:(int)anInt;
+- (NSString *)unsignedIntDescriptionAtIndex:(int)anInt;
+- (NSString *)shortDescriptionAtIndex:(int)anInt;
+- (NSString *)unsignedShortDescriptionAtIndex:(int)anInt;
+- (NSString *)longDescriptionAtIndex:(int)anInt;
+- (NSString *)unsignedLongDescriptionAtIndex:(int)anInt;
+- (NSString *)longLongDescriptionAtIndex:(int)anInt;
+- (NSString *)unsignedLongLongDescriptionAtIndex:(int)anInt;
+- (NSString *)doubleDescriptionAtIndex:(int)anInt;
+- (NSString *)floatDescriptionAtIndex:(int)anInt;
+- (NSString *)structDescriptionAtIndex:(int)anInt;
+- (NSString *)pointerDescriptionAtIndex:(int)anInt;
+- (NSString *)cStringDescriptionAtIndex:(int)anInt;
+- (NSString *)selectorDescriptionAtIndex:(int)anInt;
+
+@end
Pods/Kiwi/Classes/NSInvocation+OCMAdditions.m
@@ -0,0 +1,337 @@
+//---------------------------------------------------------------------------------------
+//  $Id$
+//  Copyright (c) 2006-2009 by Mulle Kybernetik. See License file for details.
+//---------------------------------------------------------------------------------------
+
+#import "NSInvocation+OCMAdditions.h"
+
+
+@implementation NSInvocation(OCMAdditions)
+
+- (id)getArgumentAtIndexAsObject:(int)argIndex
+{
+	const char* argType;
+	
+	argType = [[self methodSignature] getArgumentTypeAtIndex:argIndex];
+	while(strchr("rnNoORV", argType[0]) != NULL)
+		argType += 1;
+	
+	if((strlen(argType) > 1) && (strchr("{^", argType[0]) == NULL) && (strcmp("@?", argType) != 0))
+		[NSException raise:NSInvalidArgumentException format:@"Cannot handle argument type '%s'.", argType];
+	
+	switch (argType[0]) 
+	{
+		case '#':
+		case '@': 
+		{
+			id value;
+			[self getArgument:&value atIndex:argIndex];
+			return value;
+		}
+		case ':':
+ 		{
+ 			SEL s = (SEL)0;
+ 			[self getArgument:&s atIndex:argIndex];
+ 			id value = NSStringFromSelector(s);
+ 			return value;
+ 		}
+		case 'i': 
+		{
+			int value;
+			[self getArgument:&value atIndex:argIndex];
+			return @(value);
+		}	
+		case 's':
+		{
+			short value;
+			[self getArgument:&value atIndex:argIndex];
+			return @(value);
+		}	
+		case 'l':
+		{
+			long value;
+			[self getArgument:&value atIndex:argIndex];
+			return @(value);
+		}	
+		case 'q':
+		{
+			long long value;
+			[self getArgument:&value atIndex:argIndex];
+			return @(value);
+		}	
+		case 'c':
+		{
+			char value;
+			[self getArgument:&value atIndex:argIndex];
+			return @(value);
+		}	
+		case 'C':
+		{
+			unsigned char value;
+			[self getArgument:&value atIndex:argIndex];
+			return @(value);
+		}	
+		case 'I':
+		{
+			unsigned int value;
+			[self getArgument:&value atIndex:argIndex];
+			return @(value);
+		}	
+		case 'S':
+		{
+			unsigned short value;
+			[self getArgument:&value atIndex:argIndex];
+			return @(value);
+		}	
+		case 'L':
+		{
+			unsigned long value;
+			[self getArgument:&value atIndex:argIndex];
+			return @(value);
+		}	
+		case 'Q':
+		{
+			unsigned long long value;
+			[self getArgument:&value atIndex:argIndex];
+			return @(value);
+		}	
+		case 'f':
+		{
+			float value;
+			[self getArgument:&value atIndex:argIndex];
+			return @(value);
+		}	
+		case 'd':
+		{
+			double value;
+			[self getArgument:&value atIndex:argIndex];
+			return @(value);
+		}	
+		case 'B':
+		{
+			bool value;
+			[self getArgument:&value atIndex:argIndex];
+			return @(value);
+		}
+		case '^':
+        {
+            void *value = NULL;
+            [self getArgument:&value atIndex:argIndex];
+            return [NSValue valueWithPointer:value];
+        }
+		case '{': // structure
+		{
+			NSUInteger maxArgSize = [[self methodSignature] frameLength];
+			NSMutableData *argumentData = [[[NSMutableData alloc] initWithLength:maxArgSize] autorelease];
+			[self getArgument:[argumentData mutableBytes] atIndex:argIndex];
+			return [NSValue valueWithBytes:[argumentData bytes] objCType:argType];
+		}       
+			
+	}
+	[NSException raise:NSInvalidArgumentException format:@"Argument type '%s' not supported", argType];
+	return nil;
+}
+
+- (NSString *)invocationDescription
+{
+	NSMethodSignature *methodSignature = [self methodSignature];
+	NSUInteger numberOfArgs = [methodSignature numberOfArguments];
+	
+	if (numberOfArgs == 2)
+		return NSStringFromSelector([self selector]);
+	
+	NSArray *selectorParts = [NSStringFromSelector([self selector]) componentsSeparatedByString:@":"];
+	NSMutableString *description = [[NSMutableString alloc] init];
+	unsigned int i;
+	for(i = 2; i < numberOfArgs; i++)
+	{
+		[description appendFormat:@"%@%@:", (i > 2 ? @" " : @""), selectorParts[(i - 2)]];
+		[description appendString:[self argumentDescriptionAtIndex:i]];
+	}
+	
+	return [description autorelease];
+}
+
+- (NSString *)argumentDescriptionAtIndex:(int)argIndex
+{
+	const char *argType = [[self methodSignature] getArgumentTypeAtIndex:argIndex];
+	if(strchr("rnNoORV", argType[0]) != NULL)
+		argType += 1;
+
+	switch(*argType)
+	{
+		case '@':	return [self objectDescriptionAtIndex:argIndex];
+		case 'c':	return [self charDescriptionAtIndex:argIndex];
+		case 'C':	return [self unsignedCharDescriptionAtIndex:argIndex];
+		case 'i':	return [self intDescriptionAtIndex:argIndex];
+		case 'I':	return [self unsignedIntDescriptionAtIndex:argIndex];
+		case 's':	return [self shortDescriptionAtIndex:argIndex];
+		case 'S':	return [self unsignedShortDescriptionAtIndex:argIndex];
+		case 'l':	return [self longDescriptionAtIndex:argIndex];
+		case 'L':	return [self unsignedLongDescriptionAtIndex:argIndex];
+		case 'q':	return [self longLongDescriptionAtIndex:argIndex];
+		case 'Q':	return [self unsignedLongLongDescriptionAtIndex:argIndex];
+		case 'd':	return [self doubleDescriptionAtIndex:argIndex];
+		case 'f':	return [self floatDescriptionAtIndex:argIndex];
+		// Why does this throw EXC_BAD_ACCESS when appending the string?
+		//	case NSObjCStructType: return [self structDescriptionAtIndex:index];
+		case '^':	return [self pointerDescriptionAtIndex:argIndex];
+		case '*':	return [self cStringDescriptionAtIndex:argIndex];
+		case ':':	return [self selectorDescriptionAtIndex:argIndex];
+		default:	return [@"<??" stringByAppendingString:@">"];  // avoid confusion with trigraphs...
+	}
+	
+}
+
+
+- (NSString *)objectDescriptionAtIndex:(int)anInt
+{
+	id object;
+	
+	[self getArgument:&object atIndex:anInt];
+	if (object == nil)
+		return @"nil";
+	else if(![object isProxy] && [object isKindOfClass:[NSString class]])
+		return [NSString stringWithFormat:@"@\"%@\"", [object description]];
+	else
+		return [object description];
+}
+
+- (NSString *)charDescriptionAtIndex:(int)anInt
+{
+	unsigned char buffer[128];
+	memset(buffer, 0x0, 128);
+	
+	[self getArgument:&buffer atIndex:anInt];
+	
+	// If there's only one character in the buffer, and it's 0 or 1, then we have a BOOL
+	if (buffer[1] == '\0' && (buffer[0] == 0 || buffer[0] == 1))
+		return [NSString stringWithFormat:@"%@", (buffer[0] == 1 ? @"YES" : @"NO")];
+	else
+		return [NSString stringWithFormat:@"'%c'", *buffer];
+}
+
+- (NSString *)unsignedCharDescriptionAtIndex:(int)anInt
+{
+	unsigned char buffer[128];
+	memset(buffer, 0x0, 128);
+	
+	[self getArgument:&buffer atIndex:anInt];
+	return [NSString stringWithFormat:@"'%c'", *buffer];
+}
+
+- (NSString *)intDescriptionAtIndex:(int)anInt
+{
+	int intValue;
+	
+	[self getArgument:&intValue atIndex:anInt];
+	return [NSString stringWithFormat:@"%d", intValue];
+}
+
+- (NSString *)unsignedIntDescriptionAtIndex:(int)anInt
+{
+	unsigned int intValue;
+	
+	[self getArgument:&intValue atIndex:anInt];
+	return [NSString stringWithFormat:@"%d", intValue];
+}
+
+- (NSString *)shortDescriptionAtIndex:(int)anInt
+{
+	short shortValue;
+	
+	[self getArgument:&shortValue atIndex:anInt];
+	return [NSString stringWithFormat:@"%hi", shortValue];
+}
+
+- (NSString *)unsignedShortDescriptionAtIndex:(int)anInt
+{
+	unsigned short shortValue;
+	
+	[self getArgument:&shortValue atIndex:anInt];
+	return [NSString stringWithFormat:@"%hu", shortValue];
+}
+
+- (NSString *)longDescriptionAtIndex:(int)anInt
+{
+	long longValue;
+	
+	[self getArgument:&longValue atIndex:anInt];
+	return [NSString stringWithFormat:@"%ld", longValue];
+}
+
+- (NSString *)unsignedLongDescriptionAtIndex:(int)anInt
+{
+	unsigned long longValue;
+	
+	[self getArgument:&longValue atIndex:anInt];
+	return [NSString stringWithFormat:@"%lu", longValue];
+}
+
+- (NSString *)longLongDescriptionAtIndex:(int)anInt
+{
+	long long longLongValue;
+	
+	[self getArgument:&longLongValue atIndex:anInt];
+	return [NSString stringWithFormat:@"%qi", longLongValue];
+}
+
+- (NSString *)unsignedLongLongDescriptionAtIndex:(int)anInt
+{
+	unsigned long long longLongValue;
+	
+	[self getArgument:&longLongValue atIndex:anInt];
+	return [NSString stringWithFormat:@"%qu", longLongValue];
+}
+
+- (NSString *)doubleDescriptionAtIndex:(int)anInt;
+{
+	double doubleValue;
+	
+	[self getArgument:&doubleValue atIndex:anInt];
+	return [NSString stringWithFormat:@"%f", doubleValue];
+}
+
+- (NSString *)floatDescriptionAtIndex:(int)anInt
+{
+	float floatValue;
+	
+	[self getArgument:&floatValue atIndex:anInt];
+	return [NSString stringWithFormat:@"%f", floatValue];
+}
+
+- (NSString *)structDescriptionAtIndex:(int)anInt;
+{
+	void *buffer;
+	
+	[self getArgument:&buffer atIndex:anInt];
+	return [NSString stringWithFormat:@":(struct)%p", buffer];
+}
+
+- (NSString *)pointerDescriptionAtIndex:(int)anInt
+{
+	void *buffer;
+	
+	[self getArgument:&buffer atIndex:anInt];
+	return [NSString stringWithFormat:@"%p", buffer];
+}
+
+- (NSString *)cStringDescriptionAtIndex:(int)anInt
+{
+	char buffer[128];
+	
+	memset(buffer, 0x0, 128);
+	
+	[self getArgument:&buffer atIndex:anInt];
+	return [NSString stringWithFormat:@"\"%s\"", buffer];
+}
+
+- (NSString *)selectorDescriptionAtIndex:(int)anInt
+{
+	SEL selectorValue;
+	
+	[self getArgument:&selectorValue atIndex:anInt];
+	return [NSString stringWithFormat:@"@selector(%@)", NSStringFromSelector(selectorValue)];
+}
+
+@end
Pods/Kiwi/Classes/NSMethodSignature+KiwiAdditions.h
@@ -0,0 +1,17 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+
+@interface NSMethodSignature(KiwiAdditions)
+
+#pragma mark -
+#pragma mark Getting Information on Message Arguments
+
+- (NSUInteger)numberOfMessageArguments;
+- (const char *)messageArgumentTypeAtIndex:(NSUInteger)anIndex;
+
+@end
Pods/Kiwi/Classes/NSMethodSignature+KiwiAdditions.m
@@ -0,0 +1,22 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "NSMethodSignature+KiwiAdditions.h"
+
+@implementation NSMethodSignature(KiwiAdditions)
+
+#pragma mark -
+#pragma mark Getting Information on Message Arguments
+
+- (NSUInteger)numberOfMessageArguments {
+    return [self numberOfArguments] - 2;
+}
+
+- (const char *)messageArgumentTypeAtIndex:(NSUInteger)anIndex {
+    return [self getArgumentTypeAtIndex:anIndex + 2];
+}
+
+@end
Pods/Kiwi/Classes/NSNumber+KiwiAdditions.h
@@ -0,0 +1,31 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+
+@interface NSNumber(KiwiAdditions)
+
+#pragma mark -
+#pragma mark Creating Numbers
+
++ (id)numberWithBytes:(const void *)bytes objCType:(const char *)anObjCType;
++ (id)numberWithBoolBytes:(const void *)bytes;
++ (id)numberWithCharBytes:(const void *)bytes;
++ (id)numberWithDoubleBytes:(const void *)bytes;
++ (id)numberWithFloatBytes:(const void *)bytes;
++ (id)numberWithIntBytes:(const void *)bytes;
++ (id)numberWithIntegerBytes:(const void *)bytes;
++ (id)numberWithLongBytes:(const void *)bytes;
++ (id)numberWithLongLongBytes:(const void *)bytes;
++ (id)numberWithShortBytes:(const void *)bytes;
++ (id)numberWithUnsignedCharBytes:(const void *)bytes;
++ (id)numberWithUnsignedIntBytes:(const void *)bytes;
++ (id)numberWithUnsignedIntegerBytes:(const void *)bytes;
++ (id)numberWithUnsignedLongBytes:(const void *)bytes;
++ (id)numberWithUnsignedLongLongBytes:(const void *)bytes;
++ (id)numberWithUnsignedShortBytes:(const void *)bytes;
+
+@end
Pods/Kiwi/Classes/NSNumber+KiwiAdditions.m
@@ -0,0 +1,111 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "NSNumber+KiwiAdditions.h"
+#import "KWObjCUtilities.h"
+
+@implementation NSNumber(KiwiAdditions)
+
+#pragma mark -
+#pragma mark Creating Numbers
+
++ (id)numberWithBytes:(const void *)bytes objCType:(const char *)anObjCType {
+    // Yeah, this is ugly.
+    if (KWObjCTypeEqualToObjCType(anObjCType, @encode(BOOL)))
+        return [self numberWithBoolBytes:bytes];
+    else if (KWObjCTypeEqualToObjCType(anObjCType, @encode(char)))
+        return [self numberWithCharBytes:bytes];
+    else if (KWObjCTypeEqualToObjCType(anObjCType, @encode(double)))
+        return [self numberWithDoubleBytes:bytes];
+    else if (KWObjCTypeEqualToObjCType(anObjCType, @encode(float)))
+        return [self numberWithFloatBytes:bytes];
+    else if (KWObjCTypeEqualToObjCType(anObjCType, @encode(int)))
+        return [self numberWithIntBytes:bytes];
+    else if (KWObjCTypeEqualToObjCType(anObjCType, @encode(NSInteger)))
+        return [self numberWithIntegerBytes:bytes];
+    else if (KWObjCTypeEqualToObjCType(anObjCType, @encode(long)))
+        return [self numberWithLongBytes:bytes];
+    else if (KWObjCTypeEqualToObjCType(anObjCType, @encode(long long)))
+        return [self numberWithLongLongBytes:bytes];
+    else if (KWObjCTypeEqualToObjCType(anObjCType, @encode(short)))
+        return [self numberWithShortBytes:bytes];
+    else if (KWObjCTypeEqualToObjCType(anObjCType, @encode(unsigned char)))
+        return [self numberWithUnsignedCharBytes:bytes];
+    else if (KWObjCTypeEqualToObjCType(anObjCType, @encode(unsigned int)))
+        return [self numberWithUnsignedIntBytes:bytes];
+    else if (KWObjCTypeEqualToObjCType(anObjCType, @encode(NSUInteger)))
+        return [self numberWithUnsignedIntegerBytes:bytes];
+    else if (KWObjCTypeEqualToObjCType(anObjCType, @encode(unsigned long)))
+        return [self numberWithUnsignedLongBytes:bytes];
+    else if (KWObjCTypeEqualToObjCType(anObjCType, @encode(unsigned long long)))
+        return [self numberWithUnsignedLongLongBytes:bytes];
+    else if (KWObjCTypeEqualToObjCType(anObjCType, @encode(unsigned short)))
+        return [self numberWithUnsignedShortBytes:bytes];
+    else
+        return nil;
+}
+
++ (id)numberWithBoolBytes:(const void *)bytes {
+    return @(*(const BOOL *)bytes);
+}
+
++ (id)numberWithCharBytes:(const void *)bytes {
+    return @(*(const char *)bytes);
+}
+
++ (id)numberWithDoubleBytes:(const void *)bytes {
+    return @(*(const double *)bytes);
+}
+
++ (id)numberWithFloatBytes:(const void *)bytes {
+    return @(*(const float *)bytes);
+}
+
++ (id)numberWithIntBytes:(const void *)bytes {
+    return @(*(const int *)bytes);
+}
+
++ (id)numberWithIntegerBytes:(const void *)bytes {
+    return @(*(const NSInteger *)bytes);
+}
+
++ (id)numberWithLongBytes:(const void *)bytes {
+    return @(*(const long *)bytes);
+}
+
++ (id)numberWithLongLongBytes:(const void *)bytes {
+    return @(*(const long long *)bytes);
+}
+
++ (id)numberWithShortBytes:(const void *)bytes {
+    return @(*(const short *)bytes);
+}
+
++ (id)numberWithUnsignedCharBytes:(const void *)bytes {
+    return @(*(const unsigned char *)bytes);
+}
+
++ (id)numberWithUnsignedIntBytes:(const void *)bytes {
+    return @(*(const unsigned int *)bytes);
+}
+
++ (id)numberWithUnsignedIntegerBytes:(const void *)bytes {
+    return @(*(const NSUInteger *)bytes);
+}
+
++ (id)numberWithUnsignedLongBytes:(const void *)bytes {
+    return @(*(const unsigned long *)bytes);
+}
+
++ (id)numberWithUnsignedLongLongBytes:(const void *)bytes {
+    return @(*(const unsigned long long *)bytes);
+}
+
++ (id)numberWithUnsignedShortBytes:(const void *)bytes {
+    return @(*(const unsigned short *)bytes);
+}
+
+@end
Pods/Kiwi/Classes/NSObject+KiwiMockAdditions.h
@@ -0,0 +1,20 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+
+@interface NSObject(KiwiMockAdditions)
+
+#pragma mark -
+#pragma mark Creating Mocks
+
++ (id)mock;
++ (id)mockWithName:(NSString *)aName;
+
++ (id)nullMock;
++ (id)nullMockWithName:(NSString *)aName;
+
+@end
Pods/Kiwi/Classes/NSObject+KiwiMockAdditions.m
@@ -0,0 +1,31 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "NSObject+KiwiMockAdditions.h"
+#import "KWMock.h"
+
+@implementation NSObject(KiwiMockAdditions)
+
+#pragma mark -
+#pragma mark Creating Mocks
+
++ (id)mock {
+    return [KWMock mockForClass:[self class]];
+}
+
++ (id)mockWithName:(NSString *)aName {
+    return [KWMock mockWithName:aName forClass:[self class]];
+}
+
++ (id)nullMock {
+    return [KWMock nullMockForClass:[self class]];
+}
+
++ (id)nullMockWithName:(NSString *)aName {
+    return [KWMock nullMockWithName:aName forClass:[self class]];
+}
+
+@end
Pods/Kiwi/Classes/NSObject+KiwiSpyAdditions.h
@@ -0,0 +1,14 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+
+@class KWCaptureSpy;
+
+@interface NSObject (KiwiSpyAdditions)
+- (KWCaptureSpy *)captureArgument:(SEL)selector atIndex:(NSUInteger)index;
++ (KWCaptureSpy *)captureArgument:(SEL)selector atIndex:(NSUInteger)index;
+@end
Pods/Kiwi/Classes/NSObject+KiwiSpyAdditions.m
@@ -0,0 +1,29 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "NSObject+KiwiSpyAdditions.h"
+
+#import "KWCaptureSpy.h"
+#import "KWMessagePattern.h"
+#import "NSObject+KiwiStubAdditions.h"
+
+@implementation NSObject (KiwiSpyAdditions)
+
+- (KWCaptureSpy *)captureArgument:(SEL)selector atIndex:(NSUInteger)index {
+    KWCaptureSpy *spy = [[[KWCaptureSpy alloc] initWithArgumentIndex:index] autorelease];
+    KWMessagePattern *pattern = [[[KWMessagePattern alloc] initWithSelector:selector] autorelease];
+    [self addMessageSpy:spy forMessagePattern:pattern];
+    return spy;
+}
+
++ (KWCaptureSpy *)captureArgument:(SEL)selector atIndex:(NSUInteger)index {
+    KWCaptureSpy *spy = [[[KWCaptureSpy alloc] initWithArgumentIndex:index] autorelease];
+    KWMessagePattern *pattern = [[[KWMessagePattern alloc] initWithSelector:selector] autorelease];
+    [self addMessageSpy:spy forMessagePattern:pattern];
+    return spy;
+}
+
+@end
Pods/Kiwi/Classes/NSObject+KiwiStubAdditions.h
@@ -0,0 +1,54 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+
+@class KWMessagePattern;
+
+@protocol KWMessageSpying;
+
+@interface NSObject(KiwiStubAdditions)
+
+#pragma mark -
+#pragma mark Stubbing Methods
+
+- (void)stub:(SEL)aSelector;
+- (void)stub:(SEL)aSelector withBlock:(id (^)(NSArray *params))block;
+- (void)stub:(SEL)aSelector withArguments:(id)firstArgument, ...;
+- (void)stub:(SEL)aSelector andReturn:(id)aValue;
+- (void)stub:(SEL)aSelector andReturn:(id)aValue withArguments:(id)firstArgument, ...;
+
++ (void)stub:(SEL)aSelector;
++ (void)stub:(SEL)aSelector withBlock:(id (^)(NSArray *params))block;
++ (void)stub:(SEL)aSelector withArguments:(id)firstArgument, ...;
++ (void)stub:(SEL)aSelector andReturn:(id)aValue;
++ (void)stub:(SEL)aSelector andReturn:(id)aValue withArguments:(id)firstArgument, ...;
+
+- (id)stub;
+- (id)stubAndReturn:(id)aValue;
+- (id)stubAndReturn:(id)aValue times:(id)times afterThatReturn:(id)aSecondValue;
+
+- (void)stubMessagePattern:(KWMessagePattern *)aMessagePattern andReturn:(id)aValue;
+- (void)stubMessagePattern:(KWMessagePattern *)aMessagePattern andReturn:(id)aValue overrideExisting:(BOOL)overrideExisting;
+- (void)stubMessagePattern:(KWMessagePattern *)aMessagePattern andReturn:(id)aValue times:(id)times afterThatReturn:(id)aSecondValue;
+- (void)stubMessagePattern:(KWMessagePattern *)aMessagePattern withBlock:(id (^)(NSArray *params))block;
+
++ (void)stubMessagePattern:(KWMessagePattern *)aMessagePattern andReturn:(id)aValue;
++ (void)stubMessagePattern:(KWMessagePattern *)aMessagePattern andReturn:(id)aValue times:(id)times afterThatReturn:(id)aSecondValue;
++ (void)stubMessagePattern:(KWMessagePattern *)aMessagePattern withBlock:(id (^)(NSArray *params))block;
+
+- (void)clearStubs;
+
+#pragma mark -
+#pragma mark Spying on Messages
+
+- (void)addMessageSpy:(id<KWMessageSpying>)aSpy forMessagePattern:(KWMessagePattern *)aMessagePattern;
+- (void)removeMessageSpy:(id<KWMessageSpying>)aSpy forMessagePattern:(KWMessagePattern *)aMessagePattern;
+
++ (void)addMessageSpy:(id<KWMessageSpying>)aSpy forMessagePattern:(KWMessagePattern *)aMessagePattern;
++ (void)removeMessageSpy:(id<KWMessageSpying>)aSpy forMessagePattern:(KWMessagePattern *)aMessagePattern;
+
+@end
Pods/Kiwi/Classes/NSObject+KiwiStubAdditions.m
@@ -0,0 +1,248 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "NSObject+KiwiStubAdditions.h"
+#import "KWIntercept.h"
+#import "KWInvocationCapturer.h"
+#import "KWMessagePattern.h"
+#import "KWObjCUtilities.h"
+#import "KWStringUtilities.h"
+#import "KWStub.h"
+
+static NSString * const StubValueKey = @"StubValueKey";
+static NSString * const StubSecondValueKey = @"StubSecondValueKey";
+static NSString * const ChangeStubValueAfterTimesKey = @"ChangeStubValueAfterTimesKey";
+
+@implementation NSObject(KiwiStubAdditions)
+
+#pragma mark -
+#pragma mark Capturing Invocations
+
+- (NSMethodSignature *)invocationCapturer:(KWInvocationCapturer *)anInvocationCapturer methodSignatureForSelector:(SEL)aSelector {
+    NSMethodSignature *signature = [self methodSignatureForSelector:aSelector];
+
+    if (signature != nil)
+        return signature;
+
+    NSString *encoding = KWEncodingForVoidMethod();
+    return [NSMethodSignature signatureWithObjCTypes:[encoding UTF8String]];
+}
+
+- (void)invocationCapturer:(KWInvocationCapturer *)anInvocationCapturer didCaptureInvocation:(NSInvocation *)anInvocation {
+    KWMessagePattern *messagePattern = [KWMessagePattern messagePatternFromInvocation:anInvocation];
+    id value = (anInvocationCapturer.userInfo)[StubValueKey];
+    if (!(anInvocationCapturer.userInfo)[StubSecondValueKey]) {
+        [self stubMessagePattern:messagePattern andReturn:value];
+    } else {
+        id times = (anInvocationCapturer.userInfo)[ChangeStubValueAfterTimesKey];
+        id secondValue = (anInvocationCapturer.userInfo)[StubSecondValueKey];
+        [self stubMessagePattern:messagePattern andReturn:value times:times afterThatReturn:secondValue];
+    }
+}
+
+#pragma mark -
+#pragma mark Stubbing Methods
+
+- (void)stub:(SEL)aSelector {
+    KWMessagePattern *messagePattern = [KWMessagePattern messagePatternWithSelector:aSelector];
+    [self stubMessagePattern:messagePattern andReturn:nil];
+}
+
+- (void)stub:(SEL)aSelector withBlock:(id (^)(NSArray *))block {
+    KWMessagePattern *messagePattern = [KWMessagePattern messagePatternWithSelector:aSelector];
+    [self stubMessagePattern:messagePattern withBlock:block];
+}
+
+- (void)stub:(SEL)aSelector withArguments:(id)firstArgument, ... {
+    va_list argumentList;
+    va_start(argumentList, firstArgument);
+    KWMessagePattern *messagePattern = [KWMessagePattern messagePatternWithSelector:aSelector firstArgumentFilter:firstArgument argumentList:argumentList];
+    [self stubMessagePattern:messagePattern andReturn:nil];
+}
+
+- (void)stub:(SEL)aSelector andReturn:(id)aValue {
+    KWMessagePattern *messagePattern = [KWMessagePattern messagePatternWithSelector:aSelector];
+    [self stubMessagePattern:messagePattern andReturn:aValue];
+}
+
+- (void)stub:(SEL)aSelector andReturn:(id)aValue withArguments:(id)firstArgument, ... {
+    va_list argumentList;
+    va_start(argumentList, firstArgument);
+    KWMessagePattern *messagePattern = [KWMessagePattern messagePatternWithSelector:aSelector firstArgumentFilter:firstArgument argumentList:argumentList];
+    [self stubMessagePattern:messagePattern andReturn:aValue];
+}
+
++ (void)stub:(SEL)aSelector {
+    KWMessagePattern *messagePattern = [KWMessagePattern messagePatternWithSelector:aSelector];
+    [self stubMessagePattern:messagePattern andReturn:nil];
+}
+
++ (void)stub:(SEL)aSelector withBlock:(id (^)(NSArray *))block {
+    KWMessagePattern *messagePattern = [KWMessagePattern messagePatternWithSelector:aSelector];
+    [self stubMessagePattern:messagePattern withBlock:block];
+}
+
++ (void)stub:(SEL)aSelector withArguments:(id)firstArgument, ... {
+    va_list argumentList;
+    va_start(argumentList, firstArgument);
+    KWMessagePattern *messagePattern = [KWMessagePattern messagePatternWithSelector:aSelector firstArgumentFilter:firstArgument argumentList:argumentList];
+    [self stubMessagePattern:messagePattern andReturn:nil];
+}
+
++ (void)stub:(SEL)aSelector andReturn:(id)aValue {
+    KWMessagePattern *messagePattern = [KWMessagePattern messagePatternWithSelector:aSelector];
+    [self stubMessagePattern:messagePattern andReturn:aValue];
+}
+
++ (void)stub:(SEL)aSelector andReturn:(id)aValue withArguments:(id)firstArgument, ... {
+    va_list argumentList;
+    va_start(argumentList, firstArgument);
+    KWMessagePattern *messagePattern = [KWMessagePattern messagePatternWithSelector:aSelector firstArgumentFilter:firstArgument argumentList:argumentList];
+    [self stubMessagePattern:messagePattern andReturn:aValue];
+}
+
+- (id)stub {
+    return [KWInvocationCapturer invocationCapturerWithDelegate:self];
+}
+
+- (id)stubAndReturn:(id)aValue {
+    NSDictionary *userInfo = @{StubValueKey: aValue};
+    return [KWInvocationCapturer invocationCapturerWithDelegate:self userInfo:userInfo];
+}
+
+- (id)stubAndReturn:(id)aValue times:(id)times afterThatReturn:(id)aSecondValue {
+    NSDictionary *userInfo = @{StubValueKey: aValue, ChangeStubValueAfterTimesKey: times, StubSecondValueKey: aSecondValue};
+    return [KWInvocationCapturer invocationCapturerWithDelegate:self userInfo:userInfo];
+}
+
+- (void)stubMessagePattern:(KWMessagePattern *)aMessagePattern andReturn:(id)aValue {
+    [self stubMessagePattern:aMessagePattern andReturn:aValue overrideExisting:YES];
+}
+
+- (void)stubMessagePattern:(KWMessagePattern *)aMessagePattern andReturn:(id)aValue overrideExisting:(BOOL)overrideExisting {
+    if ([self methodSignatureForSelector:aMessagePattern.selector] == nil) {
+        [NSException raise:@"KWStubException" format:@"cannot stub -%@ because no such method exists",
+         NSStringFromSelector(aMessagePattern.selector)];
+    }
+    
+    Class interceptClass = KWSetupObjectInterceptSupport(self);
+    KWSetupMethodInterceptSupport(interceptClass, aMessagePattern.selector);
+    KWStub *stub = [KWStub stubWithMessagePattern:aMessagePattern value:aValue];
+    KWAssociateObjectStub(self, stub, overrideExisting);
+}
+
+- (void)stubMessagePattern:(KWMessagePattern *)aMessagePattern andReturn:(id)aValue times:(id)times afterThatReturn:(id)aSecondValue {
+    if ([self methodSignatureForSelector:aMessagePattern.selector] == nil) {
+        [NSException raise:@"KWStubException" format:@"cannot stub -%@ because no such method exists",
+         NSStringFromSelector(aMessagePattern.selector)];
+    }
+
+    Class interceptClass = KWSetupObjectInterceptSupport(self);
+    KWSetupMethodInterceptSupport(interceptClass, aMessagePattern.selector);
+    KWStub *stub = [KWStub stubWithMessagePattern:aMessagePattern value:aValue times:times afterThatReturn:aSecondValue];
+    KWAssociateObjectStub(self, stub, YES);
+}
+
+- (void)stubMessagePattern:(KWMessagePattern *)aMessagePattern withBlock:(id (^)(NSArray *params))block {
+    if ([self methodSignatureForSelector:aMessagePattern.selector] == nil) {
+        [NSException raise:@"KWStubException" format:@"cannot stub -%@ because no such method exists",
+         NSStringFromSelector(aMessagePattern.selector)];
+    }
+    
+    Class interceptClass = KWSetupObjectInterceptSupport(self);
+    KWSetupMethodInterceptSupport(interceptClass, aMessagePattern.selector);
+    KWStub *stub = [KWStub stubWithMessagePattern:aMessagePattern block:block];
+    KWAssociateObjectStub(self, stub, YES);
+}
+
++ (void)stubMessagePattern:(KWMessagePattern *)aMessagePattern andReturn:(id)aValue
+{
+    [self stubMessagePattern:aMessagePattern andReturn:aValue overrideExisting:YES];
+}
+
++ (void)stubMessagePattern:(KWMessagePattern *)aMessagePattern andReturn:(id)aValue overrideExisting:(BOOL)override
+{
+    if ([self methodSignatureForSelector:aMessagePattern.selector] == nil) {
+        [NSException raise:@"KWStubException" format:@"cannot stub -%@ because no such method exists",
+         NSStringFromSelector(aMessagePattern.selector)];
+    }
+    
+    Class interceptClass = KWSetupObjectInterceptSupport(self);
+    KWSetupMethodInterceptSupport(interceptClass, aMessagePattern.selector);
+    KWStub *stub = [KWStub stubWithMessagePattern:aMessagePattern value:aValue];
+    KWAssociateObjectStub(self, stub, override);
+}
+
++ (void)stubMessagePattern:(KWMessagePattern *)aMessagePattern andReturn:(id)aValue times:(id)times afterThatReturn:(id)aSecondValue {
+    [self stubMessagePattern:aMessagePattern andReturn:aValue times:times afterThatReturn:aSecondValue overrideExisting:YES];
+}
+
++ (void)stubMessagePattern:(KWMessagePattern *)aMessagePattern andReturn:(id)aValue times:(id)times afterThatReturn:(id)aSecondValue overrideExisting:(BOOL)override {
+    if ([self methodSignatureForSelector:aMessagePattern.selector] == nil) {
+        [NSException raise:@"KWStubException" format:@"cannot stub -%@ because no such method exists",
+         NSStringFromSelector(aMessagePattern.selector)];
+    }
+    
+    Class interceptClass = KWSetupObjectInterceptSupport(self);
+    KWSetupMethodInterceptSupport(interceptClass, aMessagePattern.selector);
+    KWStub *stub = [KWStub stubWithMessagePattern:aMessagePattern value:aValue times:times afterThatReturn:aSecondValue];
+    KWAssociateObjectStub(self, stub, override);
+}
+
++ (void)stubMessagePattern:(KWMessagePattern *)aMessagePattern withBlock:(id (^)(NSArray *params))block {
+    [self stubMessagePattern:aMessagePattern withBlock:block overrideExisting:YES];
+}
+
++ (void)stubMessagePattern:(KWMessagePattern *)aMessagePattern withBlock:(id (^)(NSArray *params))block  overrideExisting:(BOOL)override {
+    if ([self methodSignatureForSelector:aMessagePattern.selector] == nil) {
+        [NSException raise:@"KWStubException" format:@"cannot stub -%@ because no such method exists",
+         NSStringFromSelector(aMessagePattern.selector)];
+    }
+    
+    Class interceptClass = KWSetupObjectInterceptSupport(self);
+    KWSetupMethodInterceptSupport(interceptClass, aMessagePattern.selector);
+    KWStub *stub = [KWStub stubWithMessagePattern:aMessagePattern block:block];
+    KWAssociateObjectStub(self, stub, override);
+}
+
+- (void)clearStubs {
+    KWClearObjectStubs(self);
+}
+
+#pragma mark -
+#pragma mark Spying on Messages
+
+- (void)addMessageSpy:(id<KWMessageSpying>)aSpy forMessagePattern:(KWMessagePattern *)aMessagePattern {
+    if ([self methodSignatureForSelector:aMessagePattern.selector] == nil) {
+        [NSException raise:@"KWSpyException" format:@"cannot add spy for -%@ because no such method exists",
+         NSStringFromSelector(aMessagePattern.selector)];
+    }
+
+    Class interceptClass = KWSetupObjectInterceptSupport(self);
+    KWSetupMethodInterceptSupport(interceptClass, aMessagePattern.selector);
+    KWAssociateMessageSpy(self, aSpy, aMessagePattern);
+}
+
+- (void)removeMessageSpy:(id<KWMessageSpying>)aSpy forMessagePattern:(KWMessagePattern *)aMessagePattern {
+    KWClearObjectSpy(self, aSpy, aMessagePattern);
+}
+
++ (void)addMessageSpy:(id<KWMessageSpying>)aSpy forMessagePattern:(KWMessagePattern *)aMessagePattern {
+    if ([self methodSignatureForSelector:aMessagePattern.selector] == nil) {
+        [NSException raise:@"KWSpyException" format:@"cannot add spy for -%@ because no such method exists",
+         NSStringFromSelector(aMessagePattern.selector)];
+    }
+    
+    Class interceptClass = KWSetupObjectInterceptSupport(self);
+    KWSetupMethodInterceptSupport(interceptClass, aMessagePattern.selector);
+    KWAssociateMessageSpy(self, aSpy, aMessagePattern);
+}
+
++ (void)removeMessageSpy:(id<KWMessageSpying>)aSpy forMessagePattern:(KWMessagePattern *)aMessagePattern {
+    KWClearObjectSpy(self, aSpy, aMessagePattern);
+}
+
+@end
Pods/Kiwi/Classes/NSObject+KiwiVerifierAdditions.h
@@ -0,0 +1,19 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+
+@protocol KWVerifying;
+
+@interface NSObject(KiwiVerifierAdditions)
+
+#pragma mark -
+#pragma mark Attaching to Verifiers
+
+- (id)attachToVerifier:(id<KWVerifying>)aVerifier;
+- (id)attachToVerifier:(id<KWVerifying>)firstVerifier verifier:(id<KWVerifying>)secondVerifier;
+
+@end
Pods/Kiwi/Classes/NSObject+KiwiVerifierAdditions.m
@@ -0,0 +1,26 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "NSObject+KiwiVerifierAdditions.h"
+#import "KWVerifying.h"
+
+@implementation NSObject(KiwiVerifierAdditions)
+
+#pragma mark -
+#pragma mark Attaching to Verifiers
+
+- (id)attachToVerifier:(id<KWVerifying>)aVerifier {
+    [aVerifier setSubject:self];
+    return aVerifier;
+}
+
+- (id)attachToVerifier:(id<KWVerifying>)firstVerifier verifier:(id<KWVerifying>)secondVerifier {
+    [firstVerifier setSubject:self];
+    [secondVerifier setSubject:self];
+    return firstVerifier;
+}
+
+@end
Pods/Kiwi/Classes/NSProxy+KiwiVerifierAdditions.h
@@ -0,0 +1,21 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2013 Allen Ding. All rights reserved.
+//
+// Contributed by https://github.com/dwlnetnl
+//
+
+#import "KiwiConfiguration.h"
+
+@protocol KWVerifying;
+
+@interface NSProxy (KiwiVerifierAdditions)
+
+#pragma mark -
+#pragma mark Attaching to Verifiers
+
+- (id)attachToVerifier:(id<KWVerifying>)aVerifier;
+- (id)attachToVerifier:(id<KWVerifying>)firstVerifier verifier:(id<KWVerifying>)secondVerifier;
+
+@end
Pods/Kiwi/Classes/NSProxy+KiwiVerifierAdditions.m
@@ -0,0 +1,28 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2013 Allen Ding. All rights reserved.
+//
+// Contributed by https://github.com/dwlnetnl
+//
+
+#import "NSProxy+KiwiVerifierAdditions.h"
+#import "KWVerifying.h"
+
+@implementation NSProxy (KiwiVerifierAdditions)
+
+#pragma mark -
+#pragma mark Attaching to Verifiers
+
+- (id)attachToVerifier:(id<KWVerifying>)aVerifier {
+    [aVerifier setSubject:self];
+    return aVerifier;
+}
+
+- (id)attachToVerifier:(id<KWVerifying>)firstVerifier verifier:(id<KWVerifying>)secondVerifier {
+    [firstVerifier setSubject:self];
+    [secondVerifier setSubject:self];
+    return firstVerifier;
+}
+
+@end
Pods/Kiwi/Classes/NSValue+KiwiAdditions.h
@@ -0,0 +1,16 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "KiwiConfiguration.h"
+
+@interface NSValue(KiwiAdditions)
+
+#pragma mark -
+#pragma mark Accessing Data
+
+- (NSData *)dataValue;
+
+@end
Pods/Kiwi/Classes/NSValue+KiwiAdditions.m
@@ -0,0 +1,24 @@
+//
+// Licensed under the terms in License.txt
+//
+// Copyright 2010 Allen Ding. All rights reserved.
+//
+
+#import "NSValue+KiwiAdditions.h"
+#import "KWObjCUtilities.h"
+
+@implementation NSValue(KiwiAdditions)
+
+#pragma mark -
+#pragma mark Accessing Data
+
+- (NSData *)dataValue {
+    NSUInteger length = KWObjCTypeLength([self objCType]);
+    void *buffer = malloc(length);
+    [self getValue:buffer];
+    NSData *data = [NSData dataWithBytes:buffer length:length];
+    free(buffer);
+    return data;
+}
+
+@end
Pods/Kiwi/License.txt
@@ -0,0 +1,27 @@
+Copyright (c) 2010, Allen Ding
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+this list of conditions and the following disclaimer in the documentation
+and/or other materials provided with the distribution.
+
+3.  Neither the name of Allen Ding nor the names of any contributors may be
+used to endorse or promote products derived from this software without specific
+prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Pods/Kiwi/Readme.md
@@ -0,0 +1,51 @@
+# Simple BDD for iOS #
+Kiwi is a Behavior Driven Development library for iOS development.
+The goal is to provide a BDD library that is exquisitely simple to setup and use.
+
+# Kiwi 2.0 - Reboot
+https://github.com/allending/Kiwi/issues/176
+
+# Requirements #
+
+* Xcode 4.x
+* LLVM compiler recommended
+
+# Contributors #
+
+Kiwi is open-source and is developed by the community. The full list of Kiwi individual contributors is [here](https://github.com/allending/Kiwi/graphs/contributors).
+
+# Why? #
+The idea behind Kiwi is to have tests that are more readable than what is possible with the bundled test framework.
+
+Tests (or rather specs) are written in Objective-C and run within the comfort of Xcode to provide a test environment that is as unobtrusive and seamless as possible in terms of running tests and error reporting.
+
+Specs look like this:
+
+```objective-c
+describe(@"Team", ^{
+    context(@"when newly created", ^{
+        it(@"should have a name", ^{
+            id team = [Team team];
+            [[team.name should] equal:@"Black Hawks"];
+        });
+
+        it(@"should have 11 players", ^{
+            id team = [Team team];
+            [[[team should] have:11] players];
+        });
+    });
+});
+```
+
+To some of you, this might seem like an abomination. To the rest, read on...
+
+# License #
+Kiwi is open source software. You may freely distribute it under the terms of
+the license agreement found in __License.txt__.
+
+# Documentation #
+The [Kiwi Wiki](https://github.com/allending/Kiwi/wiki) is the official documentation source.
+
+# Getting it #
+The best way to get Kiwi is by using [CocoaPods](https://github.com/cocoapods/cocoapods). For all the installation details, check out the [Wiki](https://github.com/allending/kiwi/wiki)
+
Pods/Pods.xcodeproj/project.pbxproj
@@ -0,0 +1,4999 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>archiveVersion</key>
+	<string>1</string>
+	<key>classes</key>
+	<dict/>
+	<key>objectVersion</key>
+	<string>46</string>
+	<key>objects</key>
+	<dict>
+		<key>004ABF01C1C4452F9A8CDA2C</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>NSValue+KiwiAdditions.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/NSValue+KiwiAdditions.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>00FFD67452B44D24B70DD65B</key>
+		<dict>
+			<key>buildActionMask</key>
+			<string>2147483647</string>
+			<key>files</key>
+			<array>
+				<string>49374B25FDF14395B2446F22</string>
+				<string>D9CE040EDD954ECD8F63D0AD</string>
+				<string>F65058A4F839415998F4B986</string>
+				<string>3AA2AFCC1FF24865A8565A19</string>
+				<string>0CA5310D96BE48CCA008A939</string>
+				<string>50F5C9F187934F25812C4817</string>
+				<string>7F130F64E42A4649A55B5AD4</string>
+				<string>3E66E20ABC2C42DAADAA3E5C</string>
+				<string>D6E518FF34284EFDA40100DB</string>
+				<string>5F5C9877173E408495885BED</string>
+				<string>AA41C922902A430E9BEA91EC</string>
+				<string>6B85D77C3432411788FAF101</string>
+				<string>D3F1A549FA4B4204BF67413F</string>
+				<string>115826800423442EBBE9F737</string>
+				<string>1F2653B459B4414FA0FB6877</string>
+				<string>3B696D03FB3C4B76880645C3</string>
+				<string>04AA61CBBF1C46A18436FBD4</string>
+				<string>A1E662A1023E4CC3B24D880B</string>
+				<string>308DB1D543D34DD68EB20C5F</string>
+				<string>A69575EC382C438A88A5F3B4</string>
+				<string>67707BC0AC054DBBBC482837</string>
+				<string>2270719B0133461EB552FFF2</string>
+				<string>CC8CEEF5B7274192979A4A87</string>
+				<string>E73D0771D3724F989696A873</string>
+				<string>3F7268C1B7EE4020B36817DE</string>
+				<string>F21C4314B6D64696835EAFEE</string>
+				<string>02AF44DC95994E4F8C1B9C39</string>
+				<string>CC60588DCE3F481EAA9B517F</string>
+				<string>A69A35EA3B7049B89513A080</string>
+				<string>1A3EF6405E2B40D89D36923C</string>
+				<string>3D8FA9C818F24A8195C989C2</string>
+				<string>60248AC424344751B68D7261</string>
+				<string>A425E2F1CA86420D8BB81A7C</string>
+				<string>6F962186751F4F1794D4302C</string>
+				<string>C894B108FB1347918D758978</string>
+				<string>D1EE02E6D0CE4FD19201C73A</string>
+				<string>88F68C9753074F28A905483A</string>
+				<string>FD62BE4D177F4F40A5642146</string>
+				<string>B046A58FB937401E999FC141</string>
+				<string>D8003AED11434FE6BC8C73B6</string>
+				<string>6DB89A545B804DE8AE83560D</string>
+				<string>F5238E5FD4AE4F9C9B2FDEC0</string>
+				<string>AE600A02C4F54C35AF24B322</string>
+				<string>4432A5C390C44F1EB892693D</string>
+				<string>AB9026A7C00745C9A8ECD0AC</string>
+				<string>CBC90B95CB9E4C39B365A1D9</string>
+				<string>3C12D910E5F343718F7AB95D</string>
+				<string>9269FCBE48054CED9F3BD346</string>
+				<string>52EAF75C37024E95B222FCBD</string>
+				<string>335A2E9AFBA741E383A10056</string>
+				<string>23402A1C90574E69A04C858C</string>
+				<string>998DEFDA82EB48249431450B</string>
+				<string>E073FFE623934AE5B273371D</string>
+				<string>D8E1A6D3975A498D9E0F5E03</string>
+				<string>35CCAD37548E4B96B0E5BF18</string>
+				<string>2404D78CD1F44AFB830C61DC</string>
+				<string>F49E4183FD4B4DF693EB981F</string>
+				<string>38BD181DF4114444BC0CEB6A</string>
+				<string>6313968BC4AD44379C55C72F</string>
+				<string>D3F2A3D24BEA41BBAC8CD89B</string>
+				<string>665A28BA6A144F569F31B700</string>
+				<string>08D36A5B780E4712965D0D57</string>
+				<string>6F264EC602DF43E9AB70FBA1</string>
+				<string>0CF5CA37E3BF48ABB3E92DA3</string>
+				<string>B9CDE46E864F42B19C05C32F</string>
+				<string>8D581A2E3F0A4F2A8FE9C147</string>
+				<string>539C88663F944D008CF61273</string>
+				<string>249EBE9B24B14575A4C350A2</string>
+				<string>7C17EE78277D4CF7A4E7AACC</string>
+				<string>5E5EC976F6A14FB198BB8310</string>
+				<string>935173AFE9374090A1BE71B6</string>
+				<string>B0B21C25AA3F4977AC50CAB1</string>
+				<string>A7D3A33F3468459CAD59DA52</string>
+				<string>F4F4CFC0DF2845139016ECDA</string>
+				<string>4D89AF2216C34CECA6D4FC0D</string>
+				<string>C4331205A55E48509B72E31B</string>
+				<string>38FA2854B7F44F469679C268</string>
+				<string>7E445A8EB37841A594C72F2C</string>
+				<string>29E299236BC9499DACA50A9C</string>
+			</array>
+			<key>isa</key>
+			<string>PBXSourcesBuildPhase</string>
+			<key>runOnlyForDeploymentPostprocessing</key>
+			<string>0</string>
+		</dict>
+		<key>02AF44DC95994E4F8C1B9C39</key>
+		<dict>
+			<key>fileRef</key>
+			<string>28B811EAFE094379B1EA5B09</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>02FF1EBFD2C64A54854D44DB</key>
+		<dict>
+			<key>fileRef</key>
+			<string>44AB36628E9C48D3A83A02CC</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>035281F6CE8D47BFB57817D8</key>
+		<dict>
+			<key>fileRef</key>
+			<string>3B3D7FEC07A74FC5A83BC3D4</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>035D8E0B00E249D9AE526676</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWWorkarounds.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWWorkarounds.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>04AA61CBBF1C46A18436FBD4</key>
+		<dict>
+			<key>fileRef</key>
+			<string>96FDEBBC02794B24941AC94E</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>08D36A5B780E4712965D0D57</key>
+		<dict>
+			<key>fileRef</key>
+			<string>68A39E0ADF914B70BE152A63</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>0902764474A843AE8213B128</key>
+		<dict>
+			<key>fileRef</key>
+			<string>6A4C5227A2A84F9CAA6170AC</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>09D53352FF9A4BC9A730F2E4</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWBlockRaiseMatcher.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWBlockRaiseMatcher.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>0A7DED25462548EBB5428B36</key>
+		<dict>
+			<key>fileRef</key>
+			<string>64EE5B1A96DC42E2AB6DB38D</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>0B145338741D48C09288D9AA</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWFutureObject.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWFutureObject.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>0C99EEE5B5E8497F96E3E664</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWCountType.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWCountType.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>0CA5310D96BE48CCA008A939</key>
+		<dict>
+			<key>fileRef</key>
+			<string>7BA2C5C5CD1E40749907E540</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>0CF5CA37E3BF48ABB3E92DA3</key>
+		<dict>
+			<key>fileRef</key>
+			<string>CF63CAA6537D4DA9A48D17BF</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>0F789F646EF04482B108F1B8</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWExampleNode.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWExampleNode.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>0F9904CE95204B7595BA0AF9</key>
+		<dict>
+			<key>fileRef</key>
+			<string>7A1B725AA6F04B928A32F262</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>1019A3EAB77B44088EADF33F</key>
+		<dict>
+			<key>fileRef</key>
+			<string>3EA9467F531F40E491793ADC</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>115826800423442EBBE9F737</key>
+		<dict>
+			<key>fileRef</key>
+			<string>43D9DF7068C341FA82EF3BBF</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>118F770DE9BF46BD9EFF4A96</key>
+		<dict>
+			<key>fileRef</key>
+			<string>09D53352FF9A4BC9A730F2E4</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>11C410558485493A8B884190</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWStringContainsMatcher.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWStringContainsMatcher.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>11FFE6FD8CCA4452A53EBA0D</key>
+		<dict>
+			<key>fileRef</key>
+			<string>B384DD84A01743E095D3F164</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>1217927160754144B1CCAA23</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWPendingNode.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWPendingNode.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>12D26D374C7E49C5A4B97318</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWStringUtilities.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWStringUtilities.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>12FF266823204BB6BDC2A814</key>
+		<dict>
+			<key>children</key>
+			<array>
+				<string>D03761FBA3BE43DEB1C00B44</string>
+			</array>
+			<key>isa</key>
+			<string>PBXGroup</string>
+			<key>name</key>
+			<string>Pods</string>
+			<key>sourceTree</key>
+			<string>&lt;group&gt;</string>
+		</dict>
+		<key>131BBBB1961445D380DFA84F</key>
+		<dict>
+			<key>fileRef</key>
+			<string>E7E283CE27874F26837945B9</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>1339ADAC4D5E4E9B917FC0F9</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWMatchers.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWMatchers.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>14067FBC27094A558F83BE08</key>
+		<dict>
+			<key>children</key>
+			<array>
+				<string>A6042CD2B4B8483781D9635E</string>
+			</array>
+			<key>isa</key>
+			<string>PBXGroup</string>
+			<key>name</key>
+			<string>Targets Support Files</string>
+			<key>sourceTree</key>
+			<string>&lt;group&gt;</string>
+		</dict>
+		<key>142E86E1894846BAB099FD1C</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWExampleGroupDelegate.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWExampleGroupDelegate.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>14DD803CC31B48DABF80B1D2</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWGenericMatchEvaluator.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWGenericMatchEvaluator.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>14E6E400B4774FF5BF6EA637</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWExistVerifier.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWExistVerifier.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>15F985F456F948048550F4F1</key>
+		<dict>
+			<key>fileRef</key>
+			<string>A16DDD5930E44515995F48D2</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>178727151CB74C4093D8A3B0</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWBlockNode.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWBlockNode.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>178B88F1FB0349809A7CAE41</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWPendingNode.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWPendingNode.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>17A5329A7A6F4CF9B8E2053A</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWBeTrueMatcher.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWBeTrueMatcher.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>17A97ECF3DBD453EBAC2BB95</key>
+		<dict>
+			<key>fileRef</key>
+			<string>E94813AE58D64A89B2C16CB5</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>1A3EF6405E2B40D89D36923C</key>
+		<dict>
+			<key>fileRef</key>
+			<string>1B854F55159B474F81E389F7</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>1A6EB900EBC641E59A8F54EE</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWBlock.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWBlock.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>1B854F55159B474F81E389F7</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWExampleGroupBuilder.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWExampleGroupBuilder.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>1BD9A7553D8A47C08CBC64C5</key>
+		<dict>
+			<key>fileRef</key>
+			<string>004ABF01C1C4452F9A8CDA2C</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>1CC652B5129B46D3A01DD0E6</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>NSInvocation+OCMAdditions.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/NSInvocation+OCMAdditions.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>1D809AFE791E48B9995B43DE</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWSpec.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWSpec.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>1D8DF252A3F941E785FFF33A</key>
+		<dict>
+			<key>fileRef</key>
+			<string>8C28805DC9CE4D04A9ACB94A</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>1E74DBDED95043A78B153F0A</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWBeKindOfClassMatcher.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWBeKindOfClassMatcher.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>1EE4B7DCF0224B7C8609133B</key>
+		<dict>
+			<key>fileRef</key>
+			<string>CFDB82BB94184C1480680855</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>1EF026FF60A34B4EAE0BEA28</key>
+		<dict>
+			<key>fileRef</key>
+			<string>D9F96E772DF948BA93924F44</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>1F2653B459B4414FA0FB6877</key>
+		<dict>
+			<key>fileRef</key>
+			<string>17A5329A7A6F4CF9B8E2053A</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>207DD38E8CE6428395692A61</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KiwiConfiguration.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KiwiConfiguration.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>207EFF7EF3D747ADBB74F8F7</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWFailure.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWFailure.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>20BDEE670C434646B4A6A3F3</key>
+		<dict>
+			<key>fileRef</key>
+			<string>0C99EEE5B5E8497F96E3E664</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>20E57F834A094459B65F72FC</key>
+		<dict>
+			<key>fileRef</key>
+			<string>735BC950D5CF46C6A9E27E32</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>20E8B27A25194F808D5C3826</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>NSInvocation+KiwiAdditions.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/NSInvocation+KiwiAdditions.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>21B33C5EBFD940178B106BE1</key>
+		<dict>
+			<key>fileRef</key>
+			<string>BEBAA666B3314B8FB9CA2C5E</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>2212F02EE9CA473C8DC1FDBC</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWDeviceInfo.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWDeviceInfo.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>2270719B0133461EB552FFF2</key>
+		<dict>
+			<key>fileRef</key>
+			<string>B12137D2AAC2407C85CF44FE</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>228E93B8FCF443F0A0897FEE</key>
+		<dict>
+			<key>fileRef</key>
+			<string>E895ECD0996E4ABABBED3C01</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>23402A1C90574E69A04C858C</key>
+		<dict>
+			<key>fileRef</key>
+			<string>9F13DE642E9E426BA47366A0</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>236B358430A74ED9875A4E4F</key>
+		<dict>
+			<key>fileRef</key>
+			<string>B6111BFB2DF74A8B8F68C9C5</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>2404D78CD1F44AFB830C61DC</key>
+		<dict>
+			<key>fileRef</key>
+			<string>37088D73D7244DAE882E7758</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>248A89C97DD94792BCB31434</key>
+		<dict>
+			<key>fileRef</key>
+			<string>5B964674CAE043D1B5CC8604</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>249EBE9B24B14575A4C350A2</key>
+		<dict>
+			<key>fileRef</key>
+			<string>66EC2D246A54480FAD799A9B</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>2689A143F62C4BFEB0E46715</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWFailure.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWFailure.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>27C349DB7D3A4DF09875EF23</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>Pods-MovieLibraryTests-dummy.m</string>
+			<key>path</key>
+			<string>Pods-MovieLibraryTests-dummy.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>28B811EAFE094379B1EA5B09</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWDeviceInfo.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWDeviceInfo.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>29E299236BC9499DACA50A9C</key>
+		<dict>
+			<key>fileRef</key>
+			<string>27C349DB7D3A4DF09875EF23</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>2C7FD3B2CD5940E8913EFFA2</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>name</key>
+			<string>Podfile</string>
+			<key>path</key>
+			<string>../Podfile</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+			<key>xcLanguageSpecificationIdentifier</key>
+			<string>xcode.lang.ruby</string>
+		</dict>
+		<key>2D615CE341B649CAAFD3C3F0</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWBeforeAllNode.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWBeforeAllNode.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>2E6F401A858E453CA270D346</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>NSMethodSignature+KiwiAdditions.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/NSMethodSignature+KiwiAdditions.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>2F63A999C87B435E893D2E31</key>
+		<dict>
+			<key>fileRef</key>
+			<string>34609598FBE3445CB87B414F</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>308DB1D543D34DD68EB20C5F</key>
+		<dict>
+			<key>fileRef</key>
+			<string>178727151CB74C4093D8A3B0</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>30AD4C907D76422EB8242717</key>
+		<dict>
+			<key>fileRef</key>
+			<string>207EFF7EF3D747ADBB74F8F7</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>325E0E64DFB94893A889F263</key>
+		<dict>
+			<key>fileRef</key>
+			<string>8E3E49B41A8040B5B356A23D</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>335A2E9AFBA741E383A10056</key>
+		<dict>
+			<key>fileRef</key>
+			<string>CAC123F53F304E4E9E4F33B0</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>339A2561E847496986517189</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWBeBetweenMatcher.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWBeBetweenMatcher.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>34609598FBE3445CB87B414F</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWTestCase.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWTestCase.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>3485C7B4CBDB4306853C2CA4</key>
+		<dict>
+			<key>fileRef</key>
+			<string>3C7B9F5DE3D54DF09D62B5F2</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>35CCAD37548E4B96B0E5BF18</key>
+		<dict>
+			<key>fileRef</key>
+			<string>C5F6740A95FB440F82ED7AD7</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>37088D73D7244DAE882E7758</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWRaiseMatcher.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWRaiseMatcher.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>385496562A5740D38FE4137D</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>NSInvocation+KiwiAdditions.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/NSInvocation+KiwiAdditions.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>38724B756D474ED1B3D459C4</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWValue.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWValue.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>38BD181DF4114444BC0CEB6A</key>
+		<dict>
+			<key>fileRef</key>
+			<string>8DCC19C7BC204A42A653111E</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>38FA2854B7F44F469679C268</key>
+		<dict>
+			<key>fileRef</key>
+			<string>406B06FC788141B7AA945C2E</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>390CE871AD2047CEA53AA4CB</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWInvocationCapturer.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWInvocationCapturer.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>3AA2AFCC1FF24865A8565A19</key>
+		<dict>
+			<key>fileRef</key>
+			<string>93689F693E7D4254970B3067</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>3B3D7FEC07A74FC5A83BC3D4</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWCallSite.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWCallSite.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>3B696D03FB3C4B76880645C3</key>
+		<dict>
+			<key>fileRef</key>
+			<string>C7BA95175BB34B8A96C8233C</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>3BE4F2006D2549FBAF9E11D7</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWAsyncVerifier.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWAsyncVerifier.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>3C12D910E5F343718F7AB95D</key>
+		<dict>
+			<key>fileRef</key>
+			<string>697EAABAD88A4BEAA6D4EBFA</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>3C7B9F5DE3D54DF09D62B5F2</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWMock.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWMock.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>3D8FA9C818F24A8195C989C2</key>
+		<dict>
+			<key>fileRef</key>
+			<string>7BB183382EAF4B9BB7495F08</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>3E66E20ABC2C42DAADAA3E5C</key>
+		<dict>
+			<key>fileRef</key>
+			<string>CB03A674DD804F06B9A246F4</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>3EA9467F531F40E491793ADC</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>NSProxy+KiwiVerifierAdditions.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/NSProxy+KiwiVerifierAdditions.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>3F2F0DF0E4284ABD867A0EF8</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWRaiseMatcher.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWRaiseMatcher.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>3F5BC7D716F74E27A7C6BD50</key>
+		<dict>
+			<key>fileRef</key>
+			<string>D0BEA9A1434D409697AC9ABE</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>3F7268C1B7EE4020B36817DE</key>
+		<dict>
+			<key>fileRef</key>
+			<string>723E107AAD7445F08841E535</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>406B06FC788141B7AA945C2E</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>NSProxy+KiwiVerifierAdditions.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/NSProxy+KiwiVerifierAdditions.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>42369289D30C49B38A73D9A4</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWUserDefinedMatcher.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWUserDefinedMatcher.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>42C0DC972D7C4F2B9866968C</key>
+		<dict>
+			<key>fileRef</key>
+			<string>142E86E1894846BAB099FD1C</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>43739E359AAD44C884BBA1ED</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWMatchVerifier.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWMatchVerifier.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>43D9DF7068C341FA82EF3BBF</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWBeSubclassOfClassMatcher.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWBeSubclassOfClassMatcher.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>4432A5C390C44F1EB892693D</key>
+		<dict>
+			<key>fileRef</key>
+			<string>A99288FD33DE4CE685B552F0</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>449C22AA61D048898E093CD2</key>
+		<dict>
+			<key>fileRef</key>
+			<string>78B2F31072B94DDCA01963F0</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>44AB36628E9C48D3A83A02CC</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWMatching.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWMatching.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>470C3A142733430D94C66141</key>
+		<dict>
+			<key>buildConfigurations</key>
+			<array>
+				<string>E351E52A5CD840AC9F6363C8</string>
+				<string>9910A6C0E7BC46F4A6735020</string>
+			</array>
+			<key>defaultConfigurationIsVisible</key>
+			<string>0</string>
+			<key>defaultConfigurationName</key>
+			<string>Release</string>
+			<key>isa</key>
+			<string>XCConfigurationList</string>
+		</dict>
+		<key>49374B25FDF14395B2446F22</key>
+		<dict>
+			<key>fileRef</key>
+			<string>7123B1D953464DEE81BE00F4</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>4AA292CBD4F04C19A92E764C</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWExistVerifier.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWExistVerifier.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>4B912DC5B6B6476F8E9FEE42</key>
+		<dict>
+			<key>fileRef</key>
+			<string>20E8B27A25194F808D5C3826</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>4C25B4620A734B0CA1367910</key>
+		<dict>
+			<key>fileRef</key>
+			<string>CD28077AD3114BCFBF6557A0</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>4C9D0A0A71344D77AF96AF87</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>NSObject+KiwiStubAdditions.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/NSObject+KiwiStubAdditions.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>4D89AF2216C34CECA6D4FC0D</key>
+		<dict>
+			<key>fileRef</key>
+			<string>4C9D0A0A71344D77AF96AF87</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>50452B331CE74129B2C87321</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWBlock.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWBlock.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>5056C1D29AEC4B48A4ACC97F</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWObjCUtilities.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWObjCUtilities.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>50CC3F3D5D6D4DA588399F04</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWObjCUtilities.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWObjCUtilities.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>50F5C9F187934F25812C4817</key>
+		<dict>
+			<key>fileRef</key>
+			<string>758788320B604127AB6D71AF</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>515F8BD903894811BF685EFE</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWTestCase.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWTestCase.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>51BA4D8FA63443D6998F5C81</key>
+		<dict>
+			<key>fileRef</key>
+			<string>1D809AFE791E48B9995B43DE</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>520E95EBBC394C3F923EE580</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWHaveMatcher.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWHaveMatcher.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>523B0150F9154580A2E07812</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>NSObject+KiwiSpyAdditions.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/NSObject+KiwiSpyAdditions.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>52474E7DD6FD4707BF702E57</key>
+		<dict>
+			<key>fileRef</key>
+			<string>E8C6AB0A19444451875C7918</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>528F64D05B0A44889EB5936B</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWHaveValueMatcher.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWHaveValueMatcher.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>52EAF75C37024E95B222FCBD</key>
+		<dict>
+			<key>fileRef</key>
+			<string>B74BA505CA844E128AC14CA9</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>539C88663F944D008CF61273</key>
+		<dict>
+			<key>fileRef</key>
+			<string>38724B756D474ED1B3D459C4</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>53AFC84F49CA4D919B248D3A</key>
+		<dict>
+			<key>fileRef</key>
+			<string>74B1F9A4D67B4B5F899D5FF8</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>54AFD7DFF4C24784B4475584</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWBeWithinMatcher.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWBeWithinMatcher.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>56111AC705124FBD86A812DE</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWAfterEachNode.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWAfterEachNode.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>563B85565A8E4D6094B22E97</key>
+		<dict>
+			<key>fileRef</key>
+			<string>42369289D30C49B38A73D9A4</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>56CB9EBA7B2F4CD2AEA48FA4</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWBeIdenticalToMatcher.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWBeIdenticalToMatcher.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>585CAEDF7CEA419584A03067</key>
+		<dict>
+			<key>fileRef</key>
+			<string>CC18BB57A90948DBBD6E5357</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>5B1A13E2C7E241E0892FBCFF</key>
+		<dict>
+			<key>fileRef</key>
+			<string>2E6F401A858E453CA270D346</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>5B959241C97C4CB081040BF3</key>
+		<dict>
+			<key>fileRef</key>
+			<string>744F17C2722B4885915BBB72</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>5B964674CAE043D1B5CC8604</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWNull.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWNull.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>5E36493ACCF3477B85F48D55</key>
+		<dict>
+			<key>fileRef</key>
+			<string>6C019414A856426CB2D4C4FE</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>5E5EC976F6A14FB198BB8310</key>
+		<dict>
+			<key>fileRef</key>
+			<string>1CC652B5129B46D3A01DD0E6</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>5EBF4C000D2D4986B8E85358</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWMessageSpying.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWMessageSpying.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>5EF99BA5B0FC42C599F51908</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWBeSubclassOfClassMatcher.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWBeSubclassOfClassMatcher.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>5F5C9877173E408495885BED</key>
+		<dict>
+			<key>fileRef</key>
+			<string>85863A4FF4EE4FF1BCCA8D2F</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>5F8F0E8AC417462297500F94</key>
+		<dict>
+			<key>buildActionMask</key>
+			<string>2147483647</string>
+			<key>files</key>
+			<array>
+				<string>AA68476334EB497EAA844625</string>
+				<string>1D8DF252A3F941E785FFF33A</string>
+				<string>CB720A3192E14D668928B2F4</string>
+				<string>CFB357FB742A4CCA92DC9264</string>
+				<string>BF286465354C45E7A87B4A66</string>
+				<string>D55DA1F0B8B649718A3808A8</string>
+				<string>7F4F400204384DCD92595747</string>
+				<string>DE684B7FCED1463E83B86D06</string>
+				<string>C25CFE2718E64FA5A9794512</string>
+				<string>885317BA77CA46698AF0CA32</string>
+				<string>15F985F456F948048550F4F1</string>
+				<string>C13197CC396B41C095567904</string>
+				<string>8CA85C9F6F0D41A4AADCE725</string>
+				<string>E739608C25C54B538941C664</string>
+				<string>790847E7490F4639A5737A01</string>
+				<string>7EA14118DC0144BE842E4BDF</string>
+				<string>0A7DED25462548EBB5428B36</string>
+				<string>66ADF755CC5642768D391B50</string>
+				<string>AA534A127D434F20833AFE4D</string>
+				<string>B902F12830E3465AADF0BDB6</string>
+				<string>E574C0FC3FF648E4B762FDEA</string>
+				<string>0902764474A843AE8213B128</string>
+				<string>A6883211665E4A458C8CD223</string>
+				<string>B815C735DC814C7B867B3C96</string>
+				<string>118F770DE9BF46BD9EFF4A96</string>
+				<string>035281F6CE8D47BFB57817D8</string>
+				<string>325E0E64DFB94893A889F263</string>
+				<string>EAE3826E459A4F4786D9B6DF</string>
+				<string>8F295950418A4B64AEFD472A</string>
+				<string>B5F11743828A4A53B69D1F2A</string>
+				<string>EDD5B2918C994893832DAF83</string>
+				<string>20BDEE670C434646B4A6A3F3</string>
+				<string>FFF071314FFB4A5699FC66C3</string>
+				<string>9AC5FFD9E4664E9889135D3F</string>
+				<string>236B358430A74ED9875A4E4F</string>
+				<string>52474E7DD6FD4707BF702E57</string>
+				<string>42C0DC972D7C4F2B9866968C</string>
+				<string>A9D0FAA3A9004F869A4B9C97</string>
+				<string>449C22AA61D048898E093CD2</string>
+				<string>9DD5BCF687294E9B9C529B77</string>
+				<string>C05F54CFD4AB4209ACC28486</string>
+				<string>4C25B4620A734B0CA1367910</string>
+				<string>30AD4C907D76422EB8242717</string>
+				<string>C41CDB42031B478AB7D45364</string>
+				<string>CD5DF1D4027A4769BF37687F</string>
+				<string>AF1C8578CC10428485B4D3FB</string>
+				<string>53AFC84F49CA4D919B248D3A</string>
+				<string>6BE2F97BAF80410A8D54BFB2</string>
+				<string>11FFE6FD8CCA4452A53EBA0D</string>
+				<string>7AEA0F17E66546A1AFC34BE7</string>
+				<string>CC07AF99113C445583FC3BC1</string>
+				<string>1EF026FF60A34B4EAE0BEA28</string>
+				<string>757DE8E37C704D2A8406E883</string>
+				<string>B94DF013745B4E97B7F9FAED</string>
+				<string>1EE4B7DCF0224B7C8609133B</string>
+				<string>B29D3E741B794037AA22EB29</string>
+				<string>C2702B855175470B928D42DF</string>
+				<string>02FF1EBFD2C64A54854D44DB</string>
+				<string>63307A9E27894583B4574C50</string>
+				<string>5B959241C97C4CB081040BF3</string>
+				<string>AF8A3F5153954C79A9FE6B88</string>
+				<string>F74DA2C1BB41479EA3CA21CD</string>
+				<string>3485C7B4CBDB4306853C2CA4</string>
+				<string>248A89C97DD94792BCB31434</string>
+				<string>64C51B1101E14BE7A1876806</string>
+				<string>A95C44754FC4412888AA2B0C</string>
+				<string>3F5BC7D716F74E27A7C6BD50</string>
+				<string>D5CDA56B6CBF4F26812A3D6D</string>
+				<string>B213DCE81FF8474680432AE0</string>
+				<string>17A97ECF3DBD453EBAC2BB95</string>
+				<string>21B33C5EBFD940178B106BE1</string>
+				<string>0F9904CE95204B7595BA0AF9</string>
+				<string>585CAEDF7CEA419584A03067</string>
+				<string>51BA4D8FA63443D6998F5C81</string>
+				<string>E3A06A56F4984753BE31406C</string>
+				<string>AA7C5FCCB4A84DC691D69E96</string>
+				<string>DA53427E4B56431BA6181705</string>
+				<string>131BBBB1961445D380DFA84F</string>
+				<string>2F63A999C87B435E893D2E31</string>
+				<string>563B85565A8E4D6094B22E97</string>
+				<string>E1CC2DA65A594244AA21CEC1</string>
+				<string>E1D5EF7DDE07452081A8B9B5</string>
+				<string>DB399D82300E4E9F83306756</string>
+				<string>4B912DC5B6B6476F8E9FEE42</string>
+				<string>D044F0307C464A6CA7C9719B</string>
+				<string>5B1A13E2C7E241E0892FBCFF</string>
+				<string>C40B40577A604FAE864F1190</string>
+				<string>B2F4B721DF4E44E0B08B06B6</string>
+				<string>6DDCFCDE0A7B46DDA5C11482</string>
+				<string>5E36493ACCF3477B85F48D55</string>
+				<string>228E93B8FCF443F0A0897FEE</string>
+				<string>1019A3EAB77B44088EADF33F</string>
+				<string>1BD9A7553D8A47C08CBC64C5</string>
+			</array>
+			<key>isa</key>
+			<string>PBXHeadersBuildPhase</string>
+			<key>runOnlyForDeploymentPostprocessing</key>
+			<string>0</string>
+		</dict>
+		<key>60248AC424344751B68D7261</key>
+		<dict>
+			<key>fileRef</key>
+			<string>4AA292CBD4F04C19A92E764C</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>61BEAA0160CC4D82A4218EF8</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWInvocationCapturer.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWInvocationCapturer.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>62EA95A5C6AE4B519D80EC3C</key>
+		<dict>
+			<key>buildActionMask</key>
+			<string>2147483647</string>
+			<key>files</key>
+			<array>
+				<string>20E57F834A094459B65F72FC</string>
+			</array>
+			<key>isa</key>
+			<string>PBXFrameworksBuildPhase</string>
+			<key>runOnlyForDeploymentPostprocessing</key>
+			<string>0</string>
+		</dict>
+		<key>6313968BC4AD44379C55C72F</key>
+		<dict>
+			<key>fileRef</key>
+			<string>73DECDA49BD4408982BCD9F4</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>63307A9E27894583B4574C50</key>
+		<dict>
+			<key>fileRef</key>
+			<string>43739E359AAD44C884BBA1ED</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>64C51B1101E14BE7A1876806</key>
+		<dict>
+			<key>fileRef</key>
+			<string>5056C1D29AEC4B48A4ACC97F</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>64EE5B1A96DC42E2AB6DB38D</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWBeNilMatcher.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWBeNilMatcher.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>6599F55AEF0F4E7EA053A540</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWFormatter.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWFormatter.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>665A28BA6A144F569F31B700</key>
+		<dict>
+			<key>fileRef</key>
+			<string>11C410558485493A8B884190</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>66A9488311854D2AAAE53727</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWHaveValueMatcher.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWHaveValueMatcher.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>66ADF755CC5642768D391B50</key>
+		<dict>
+			<key>fileRef</key>
+			<string>DECD7B745DBA4DB1AB8A7DEF</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>66EC2D246A54480FAD799A9B</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWWorkarounds.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWWorkarounds.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>67707BC0AC054DBBBC482837</key>
+		<dict>
+			<key>fileRef</key>
+			<string>683CB37755C640A283CCDE57</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>67C111BD4B794C4ABD5681D8</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>name</key>
+			<string>Pods-MovieLibraryTests-acknowledgements.plist</string>
+			<key>path</key>
+			<string>Pods-MovieLibraryTests-acknowledgements.plist</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>683CB37755C640A283CCDE57</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWCallSite.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWCallSite.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>68A39E0ADF914B70BE152A63</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWStringPrefixMatcher.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWStringPrefixMatcher.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>68B5B3A90DD94E17A353DD0F</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWExample.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWExample.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>68DFB2A225414518B6181F2F</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWGenericMatcher.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWGenericMatcher.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>697EAABAD88A4BEAA6D4EBFA</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWMatchers.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWMatchers.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>6A4C5227A2A84F9CAA6170AC</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWBeZeroMatcher.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWBeZeroMatcher.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>6B85D77C3432411788FAF101</key>
+		<dict>
+			<key>fileRef</key>
+			<string>F270DBB48F424AAEA85E5D78</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>6BE2F97BAF80410A8D54BFB2</key>
+		<dict>
+			<key>fileRef</key>
+			<string>B732906FEF69419DB52D3FE5</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>6C019414A856426CB2D4C4FE</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>NSObject+KiwiStubAdditions.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/NSObject+KiwiStubAdditions.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>6DB89A545B804DE8AE83560D</key>
+		<dict>
+			<key>fileRef</key>
+			<string>DB0F3294030D4A59BB11FD4E</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>6DDCFCDE0A7B46DDA5C11482</key>
+		<dict>
+			<key>fileRef</key>
+			<string>EC425E90B7D6462A82604D77</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>6DEACE39915A4A07AF31B30F</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWBeMemberOfClassMatcher.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWBeMemberOfClassMatcher.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>6F264EC602DF43E9AB70FBA1</key>
+		<dict>
+			<key>fileRef</key>
+			<string>12D26D374C7E49C5A4B97318</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>6F962186751F4F1794D4302C</key>
+		<dict>
+			<key>fileRef</key>
+			<string>6599F55AEF0F4E7EA053A540</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>70BD2B70F7B24D52A18B007D</key>
+		<dict>
+			<key>buildConfigurations</key>
+			<array>
+				<string>E2383366B3964EEA9D88455F</string>
+				<string>FA0D4FC026424AB4BD5DFB61</string>
+			</array>
+			<key>defaultConfigurationIsVisible</key>
+			<string>0</string>
+			<key>defaultConfigurationName</key>
+			<string>Release</string>
+			<key>isa</key>
+			<string>XCConfigurationList</string>
+		</dict>
+		<key>7123B1D953464DEE81BE00F4</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWAfterAllNode.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWAfterAllNode.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>72063726BC0E47E7B9E59AF6</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWStringPrefixMatcher.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWStringPrefixMatcher.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>723E107AAD7445F08841E535</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWContainMatcher.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWContainMatcher.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>73093A9707EB4D9EA02F5ED3</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWProbePoller.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWProbePoller.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>735BC950D5CF46C6A9E27E32</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>wrapper.framework</string>
+			<key>name</key>
+			<string>Foundation.framework</string>
+			<key>path</key>
+			<string>Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/System/Library/Frameworks/Foundation.framework</string>
+			<key>sourceTree</key>
+			<string>DEVELOPER_DIR</string>
+		</dict>
+		<key>73DECDA49BD4408982BCD9F4</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWRespondToSelectorMatcher.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWRespondToSelectorMatcher.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>744F17C2722B4885915BBB72</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWMessagePattern.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWMessagePattern.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>74B1F9A4D67B4B5F899D5FF8</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWGenericMatchEvaluator.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWGenericMatchEvaluator.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>757DE8E37C704D2A8406E883</key>
+		<dict>
+			<key>fileRef</key>
+			<string>390CE871AD2047CEA53AA4CB</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>758788320B604127AB6D71AF</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWBeEmptyMatcher.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWBeEmptyMatcher.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>76CAAD3F09B3478CB355B1B3</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWMatcherFactory.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWMatcherFactory.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>780EA16869A14B67A3FE5520</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWBeNonNilMatcher.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWBeNonNilMatcher.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>78B2F31072B94DDCA01963F0</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWExampleNodeVisitor.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWExampleNodeVisitor.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>790847E7490F4639A5737A01</key>
+		<dict>
+			<key>fileRef</key>
+			<string>1E74DBDED95043A78B153F0A</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>79E02D8EE4BC4B91AA8807ED</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>NSObject+KiwiMockAdditions.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/NSObject+KiwiMockAdditions.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>7A1B725AA6F04B928A32F262</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWReporting.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWReporting.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>7AEA0F17E66546A1AFC34BE7</key>
+		<dict>
+			<key>fileRef</key>
+			<string>66A9488311854D2AAAE53727</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>7B5E4E0B270D4B4EA57627DF</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWAfterAllNode.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWAfterAllNode.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>7BA2C5C5CD1E40749907E540</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWBeBetweenMatcher.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWBeBetweenMatcher.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>7BB183382EAF4B9BB7495F08</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWExampleSuite.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWExampleSuite.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>7C17EE78277D4CF7A4E7AACC</key>
+		<dict>
+			<key>fileRef</key>
+			<string>385496562A5740D38FE4137D</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>7E445A8EB37841A594C72F2C</key>
+		<dict>
+			<key>fileRef</key>
+			<string>F48DDE649B374701834C560A</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>7EA14118DC0144BE842E4BDF</key>
+		<dict>
+			<key>fileRef</key>
+			<string>AEEC4FCA0EE84595B0D042FA</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>7F130F64E42A4649A55B5AD4</key>
+		<dict>
+			<key>fileRef</key>
+			<string>89456FF2B40B47BA8BF5DACD</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>7F4F400204384DCD92595747</key>
+		<dict>
+			<key>fileRef</key>
+			<string>56111AC705124FBD86A812DE</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>83280DFD41BA40EE977B68D1</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWIntercept.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWIntercept.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>83B94888F4BB4D11888D4B31</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWGenericMatchingAdditions.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWGenericMatchingAdditions.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>85129A108F6C4BEA977D738D</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWBlockNode.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWBlockNode.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>85863A4FF4EE4FF1BCCA8D2F</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWBeKindOfClassMatcher.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWBeKindOfClassMatcher.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>87EBA85A60924CF9AC3F7AB1</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWMatchVerifier.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWMatchVerifier.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>885317BA77CA46698AF0CA32</key>
+		<dict>
+			<key>fileRef</key>
+			<string>339A2561E847496986517189</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>88F68C9753074F28A905483A</key>
+		<dict>
+			<key>fileRef</key>
+			<string>14DD803CC31B48DABF80B1D2</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>89456FF2B40B47BA8BF5DACD</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWBeforeAllNode.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWBeforeAllNode.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>89FFDADB5C0B4F4A88C29B33</key>
+		<dict>
+			<key>explicitFileType</key>
+			<string>archive.ar</string>
+			<key>includeInIndex</key>
+			<string>0</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>name</key>
+			<string>libPods-MovieLibraryTests.a</string>
+			<key>path</key>
+			<string>libPods-MovieLibraryTests.a</string>
+			<key>sourceTree</key>
+			<string>BUILT_PRODUCTS_DIR</string>
+		</dict>
+		<key>8C28805DC9CE4D04A9ACB94A</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KiwiBlockMacros.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KiwiBlockMacros.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>8C5741E2669042EB90157872</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>Pods-MovieLibraryTests-environment.h</string>
+			<key>path</key>
+			<string>Pods-MovieLibraryTests-environment.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>8CA85C9F6F0D41A4AADCE725</key>
+		<dict>
+			<key>fileRef</key>
+			<string>A23D03232D7D4DE39A0CAC1C</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>8D581A2E3F0A4F2A8FE9C147</key>
+		<dict>
+			<key>fileRef</key>
+			<string>E2231E8B728F4C3BA0CDAFB4</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>8DCC19C7BC204A42A653111E</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWRegisterMatchersNode.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWRegisterMatchersNode.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>8E3E49B41A8040B5B356A23D</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWCaptureSpy.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWCaptureSpy.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>8F295950418A4B64AEFD472A</key>
+		<dict>
+			<key>fileRef</key>
+			<string>BECC1C4339D44513964D565C</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>9269FCBE48054CED9F3BD346</key>
+		<dict>
+			<key>fileRef</key>
+			<string>87EBA85A60924CF9AC3F7AB1</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>92BEEB972E4C447FBA64B931</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWStringContainsMatcher.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWStringContainsMatcher.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>935173AFE9374090A1BE71B6</key>
+		<dict>
+			<key>fileRef</key>
+			<string>CACB01B8A3E8454588137D3C</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>93689F693E7D4254970B3067</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWAsyncVerifier.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWAsyncVerifier.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>96E17864CEBB410D8D375EF4</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWMatcher.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWMatcher.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>96FDEBBC02794B24941AC94E</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWBeZeroMatcher.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWBeZeroMatcher.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>97F84C90658D4F94A47359F7</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWMessageTracker.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWMessageTracker.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>9910A6C0E7BC46F4A6735020</key>
+		<dict>
+			<key>baseConfigurationReference</key>
+			<string>E0B949617F2649179EA1B5F1</string>
+			<key>buildSettings</key>
+			<dict>
+				<key>ALWAYS_SEARCH_USER_PATHS</key>
+				<string>NO</string>
+				<key>ARCHS</key>
+				<string>$(ARCHS_STANDARD_32_BIT)</string>
+				<key>COPY_PHASE_STRIP</key>
+				<string>NO</string>
+				<key>DSTROOT</key>
+				<string>/tmp/xcodeproj.dst</string>
+				<key>GCC_C_LANGUAGE_STANDARD</key>
+				<string>gnu99</string>
+				<key>GCC_DYNAMIC_NO_PIC</key>
+				<string>NO</string>
+				<key>GCC_OPTIMIZATION_LEVEL</key>
+				<string>0</string>
+				<key>GCC_PRECOMPILE_PREFIX_HEADER</key>
+				<string>YES</string>
+				<key>GCC_PREFIX_HEADER</key>
+				<string>Pods-MovieLibraryTests-prefix.pch</string>
+				<key>GCC_PREPROCESSOR_DEFINITIONS</key>
+				<array>
+					<string>DEBUG=1</string>
+					<string>$(inherited)</string>
+				</array>
+				<key>GCC_SYMBOLS_PRIVATE_EXTERN</key>
+				<string>NO</string>
+				<key>GCC_VERSION</key>
+				<string>com.apple.compilers.llvm.clang.1_0</string>
+				<key>INSTALL_PATH</key>
+				<string>$(BUILT_PRODUCTS_DIR)</string>
+				<key>IPHONEOS_DEPLOYMENT_TARGET</key>
+				<string>4.3</string>
+				<key>OTHER_LDFLAGS</key>
+				<string></string>
+				<key>PODS_HEADERS_SEARCH_PATHS</key>
+				<string>${PODS_BUILD_HEADERS_SEARCH_PATHS}</string>
+				<key>PODS_ROOT</key>
+				<string>${SRCROOT}</string>
+				<key>PRODUCT_NAME</key>
+				<string>$(TARGET_NAME)</string>
+				<key>PUBLIC_HEADERS_FOLDER_PATH</key>
+				<string>$(TARGET_NAME)</string>
+				<key>SDKROOT</key>
+				<string>iphoneos</string>
+				<key>SKIP_INSTALL</key>
+				<string>YES</string>
+			</dict>
+			<key>isa</key>
+			<string>XCBuildConfiguration</string>
+			<key>name</key>
+			<string>Debug</string>
+		</dict>
+		<key>994952CBA1164AA0AB5ECF92</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWAny.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWAny.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>998DEFDA82EB48249431450B</key>
+		<dict>
+			<key>fileRef</key>
+			<string>F4D125E645BB45109A492665</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>9AC5FFD9E4664E9889135D3F</key>
+		<dict>
+			<key>fileRef</key>
+			<string>F841BF91ABEA40A7BB4C6BC5</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>9DD5BCF687294E9B9C529B77</key>
+		<dict>
+			<key>fileRef</key>
+			<string>D0BF6060C7FE4274B0C6215A</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>9F13DE642E9E426BA47366A0</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWMock.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWMock.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>9F85FEB1CCF34A2B8EA0108B</key>
+		<dict>
+			<key>buildConfigurationList</key>
+			<string>470C3A142733430D94C66141</string>
+			<key>buildPhases</key>
+			<array>
+				<string>00FFD67452B44D24B70DD65B</string>
+				<string>62EA95A5C6AE4B519D80EC3C</string>
+				<string>5F8F0E8AC417462297500F94</string>
+			</array>
+			<key>buildRules</key>
+			<array/>
+			<key>dependencies</key>
+			<array/>
+			<key>isa</key>
+			<string>PBXNativeTarget</string>
+			<key>name</key>
+			<string>Pods-MovieLibraryTests</string>
+			<key>productName</key>
+			<string>Pods-MovieLibraryTests</string>
+			<key>productReference</key>
+			<string>89FFDADB5C0B4F4A88C29B33</string>
+			<key>productType</key>
+			<string>com.apple.product-type.library.static</string>
+		</dict>
+		<key>A16DDD5930E44515995F48D2</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWBeEmptyMatcher.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWBeEmptyMatcher.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>A1E662A1023E4CC3B24D880B</key>
+		<dict>
+			<key>fileRef</key>
+			<string>1A6EB900EBC641E59A8F54EE</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>A23D03232D7D4DE39A0CAC1C</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWBeforeEachNode.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWBeforeEachNode.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>A38C647BE64F4EAA83B2EAD6</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWVerifying.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWVerifying.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>A425E2F1CA86420D8BB81A7C</key>
+		<dict>
+			<key>fileRef</key>
+			<string>2689A143F62C4BFEB0E46715</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>A4661B2DA61E44B2982860D4</key>
+		<dict>
+			<key>children</key>
+			<array>
+				<string>735BC950D5CF46C6A9E27E32</string>
+				<string>DFA5AFC241D44F2BA15B2923</string>
+			</array>
+			<key>isa</key>
+			<string>PBXGroup</string>
+			<key>name</key>
+			<string>Frameworks</string>
+			<key>sourceTree</key>
+			<string>&lt;group&gt;</string>
+		</dict>
+		<key>A6042CD2B4B8483781D9635E</key>
+		<dict>
+			<key>children</key>
+			<array>
+				<string>E0B949617F2649179EA1B5F1</string>
+				<string>8C5741E2669042EB90157872</string>
+				<string>B099ED648D2F4F4BA431F46F</string>
+				<string>E89FF05F0D7546E8AA433B3B</string>
+				<string>67C111BD4B794C4ABD5681D8</string>
+				<string>CA6A1A73C00D497D81940D74</string>
+				<string>27C349DB7D3A4DF09875EF23</string>
+			</array>
+			<key>isa</key>
+			<string>PBXGroup</string>
+			<key>name</key>
+			<string>Pods-MovieLibraryTests</string>
+			<key>sourceTree</key>
+			<string>&lt;group&gt;</string>
+		</dict>
+		<key>A6883211665E4A458C8CD223</key>
+		<dict>
+			<key>fileRef</key>
+			<string>50452B331CE74129B2C87321</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>A69575EC382C438A88A5F3B4</key>
+		<dict>
+			<key>fileRef</key>
+			<string>F48F4447792940CEAAC9C645</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>A69A35EA3B7049B89513A080</key>
+		<dict>
+			<key>fileRef</key>
+			<string>68B5B3A90DD94E17A353DD0F</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>A77CE17424AE4891AD99CB18</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWBeTrueMatcher.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWBeTrueMatcher.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>A7D3A33F3468459CAD59DA52</key>
+		<dict>
+			<key>fileRef</key>
+			<string>79E02D8EE4BC4B91AA8807ED</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>A91FC77036BF4E7A874B38BF</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>NSInvocation+OCMAdditions.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/NSInvocation+OCMAdditions.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>A95C44754FC4412888AA2B0C</key>
+		<dict>
+			<key>fileRef</key>
+			<string>1217927160754144B1CCAA23</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>A99288FD33DE4CE685B552F0</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWItNode.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWItNode.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>A9D0FAA3A9004F869A4B9C97</key>
+		<dict>
+			<key>fileRef</key>
+			<string>0F789F646EF04482B108F1B8</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>AA41C922902A430E9BEA91EC</key>
+		<dict>
+			<key>fileRef</key>
+			<string>6DEACE39915A4A07AF31B30F</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>AA534A127D434F20833AFE4D</key>
+		<dict>
+			<key>fileRef</key>
+			<string>5EF99BA5B0FC42C599F51908</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>AA68476334EB497EAA844625</key>
+		<dict>
+			<key>fileRef</key>
+			<string>ABDD6EDC8F04429284655550</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>AA7C5FCCB4A84DC691D69E96</key>
+		<dict>
+			<key>fileRef</key>
+			<string>72063726BC0E47E7B9E59AF6</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>AB9026A7C00745C9A8ECD0AC</key>
+		<dict>
+			<key>fileRef</key>
+			<string>96E17864CEBB410D8D375EF4</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>ABDD6EDC8F04429284655550</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>Kiwi.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/Kiwi.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>AE600A02C4F54C35AF24B322</key>
+		<dict>
+			<key>fileRef</key>
+			<string>61BEAA0160CC4D82A4218EF8</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>AEEC4FCA0EE84595B0D042FA</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWBeMemberOfClassMatcher.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWBeMemberOfClassMatcher.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>AEF7DD1C93114439A178B54A</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWGenericMatcher.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWGenericMatcher.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>AF1C8578CC10428485B4D3FB</key>
+		<dict>
+			<key>fileRef</key>
+			<string>68DFB2A225414518B6181F2F</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>AF8A3F5153954C79A9FE6B88</key>
+		<dict>
+			<key>fileRef</key>
+			<string>5EBF4C000D2D4986B8E85358</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>B046A58FB937401E999FC141</key>
+		<dict>
+			<key>fileRef</key>
+			<string>520E95EBBC394C3F923EE580</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>B099ED648D2F4F4BA431F46F</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>name</key>
+			<string>Pods-MovieLibraryTests-prefix.pch</string>
+			<key>path</key>
+			<string>Pods-MovieLibraryTests-prefix.pch</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>B0B21C25AA3F4977AC50CAB1</key>
+		<dict>
+			<key>fileRef</key>
+			<string>E2C0C61D7EE34193AB91BAFA</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>B12137D2AAC2407C85CF44FE</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWCaptureSpy.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWCaptureSpy.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>B213DCE81FF8474680432AE0</key>
+		<dict>
+			<key>fileRef</key>
+			<string>3F2F0DF0E4284ABD867A0EF8</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>B242BB1D22DB4984BBC6713F</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KiwiMacros.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KiwiMacros.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>B29D3E741B794037AA22EB29</key>
+		<dict>
+			<key>fileRef</key>
+			<string>76CAAD3F09B3478CB355B1B3</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>B2F4B721DF4E44E0B08B06B6</key>
+		<dict>
+			<key>fileRef</key>
+			<string>C84597A5631641208ADE4ECD</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>B384DD84A01743E095D3F164</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWHaveMatcher.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWHaveMatcher.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>B435AF7769884E91AB73CD5D</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KiwiNewMacros.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KiwiNewMacros.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>B5F11743828A4A53B69D1F2A</key>
+		<dict>
+			<key>fileRef</key>
+			<string>F06AB2CC47FB40BDBB77745F</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>B6111BFB2DF74A8B8F68C9C5</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWExample.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWExample.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>B732906FEF69419DB52D3FE5</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWGenericMatchingAdditions.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWGenericMatchingAdditions.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>B74BA505CA844E128AC14CA9</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWMessagePattern.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWMessagePattern.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>B815C735DC814C7B867B3C96</key>
+		<dict>
+			<key>fileRef</key>
+			<string>85129A108F6C4BEA977D738D</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>B902F12830E3465AADF0BDB6</key>
+		<dict>
+			<key>fileRef</key>
+			<string>A77CE17424AE4891AD99CB18</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>B94DF013745B4E97B7F9FAED</key>
+		<dict>
+			<key>fileRef</key>
+			<string>D1C92E6AAC4C4D0CAD71F95B</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>B9CDE46E864F42B19C05C32F</key>
+		<dict>
+			<key>fileRef</key>
+			<string>515F8BD903894811BF685EFE</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>BAEEC73B2A3C422386178E56</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWContextNode.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWContextNode.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>BD525FCE43454E3DA87A7038</key>
+		<dict>
+			<key>attributes</key>
+			<dict>
+				<key>LastUpgradeCheck</key>
+				<string>0450</string>
+			</dict>
+			<key>buildConfigurationList</key>
+			<string>70BD2B70F7B24D52A18B007D</string>
+			<key>compatibilityVersion</key>
+			<string>Xcode 3.2</string>
+			<key>developmentRegion</key>
+			<string>English</string>
+			<key>hasScannedForEncodings</key>
+			<string>0</string>
+			<key>isa</key>
+			<string>PBXProject</string>
+			<key>knownRegions</key>
+			<array>
+				<string>en</string>
+			</array>
+			<key>mainGroup</key>
+			<string>DCC99CDB3AAD4838B829FA18</string>
+			<key>productRefGroup</key>
+			<string>E66180A7881E49CF83090FD4</string>
+			<key>projectReferences</key>
+			<array/>
+			<key>targets</key>
+			<array>
+				<string>9F85FEB1CCF34A2B8EA0108B</string>
+			</array>
+		</dict>
+		<key>BEBAA666B3314B8FB9CA2C5E</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWRegisterMatchersNode.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWRegisterMatchersNode.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>BECC1C4339D44513964D565C</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWConformToProtocolMatcher.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWConformToProtocolMatcher.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>BF286465354C45E7A87B4A66</key>
+		<dict>
+			<key>fileRef</key>
+			<string>B435AF7769884E91AB73CD5D</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>C05F54CFD4AB4209ACC28486</key>
+		<dict>
+			<key>fileRef</key>
+			<string>14E6E400B4774FF5BF6EA637</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>C13197CC396B41C095567904</key>
+		<dict>
+			<key>fileRef</key>
+			<string>2D615CE341B649CAAFD3C3F0</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>C19C17BF5EA040F2B1C33BC3</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>NSNumber+KiwiAdditions.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/NSNumber+KiwiAdditions.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>C25CFE2718E64FA5A9794512</key>
+		<dict>
+			<key>fileRef</key>
+			<string>3BE4F2006D2549FBAF9E11D7</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>C2702B855175470B928D42DF</key>
+		<dict>
+			<key>fileRef</key>
+			<string>1339ADAC4D5E4E9B917FC0F9</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>C2D1A07AD4EB4257A5377F10</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWContextNode.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWContextNode.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>C40B40577A604FAE864F1190</key>
+		<dict>
+			<key>fileRef</key>
+			<string>C19C17BF5EA040F2B1C33BC3</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>C41CDB42031B478AB7D45364</key>
+		<dict>
+			<key>fileRef</key>
+			<string>E3E79291AF6B4AF2A1E645EF</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>C4331205A55E48509B72E31B</key>
+		<dict>
+			<key>fileRef</key>
+			<string>E0B0B80EA0FA45D5B807F34C</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>C5F6740A95FB440F82ED7AD7</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWProbePoller.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWProbePoller.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>C7BA95175BB34B8A96C8233C</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWBeWithinMatcher.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWBeWithinMatcher.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>C7BAA02ADCDB41C4BC9CD61D</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWChangeMatcher.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWChangeMatcher.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>C84597A5631641208ADE4ECD</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>NSObject+KiwiMockAdditions.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/NSObject+KiwiMockAdditions.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>C894B108FB1347918D758978</key>
+		<dict>
+			<key>fileRef</key>
+			<string>0B145338741D48C09288D9AA</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>CA6A1A73C00D497D81940D74</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>name</key>
+			<string>Pods-MovieLibraryTests-acknowledgements.markdown</string>
+			<key>path</key>
+			<string>Pods-MovieLibraryTests-acknowledgements.markdown</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>CAC123F53F304E4E9E4F33B0</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWMessageTracker.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWMessageTracker.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>CACB01B8A3E8454588137D3C</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>NSMethodSignature+KiwiAdditions.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/NSMethodSignature+KiwiAdditions.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>CB03A674DD804F06B9A246F4</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWBeforeEachNode.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWBeforeEachNode.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>CB720A3192E14D668928B2F4</key>
+		<dict>
+			<key>fileRef</key>
+			<string>207DD38E8CE6428395692A61</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>CBC90B95CB9E4C39B365A1D9</key>
+		<dict>
+			<key>fileRef</key>
+			<string>D854D321A93342B6BA9B4ECE</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>CC07AF99113C445583FC3BC1</key>
+		<dict>
+			<key>fileRef</key>
+			<string>D1DAE958A1EA41538AB7D3E4</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>CC18BB57A90948DBBD6E5357</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWRespondToSelectorMatcher.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWRespondToSelectorMatcher.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>CC60588DCE3F481EAA9B517F</key>
+		<dict>
+			<key>fileRef</key>
+			<string>D18A11E15AEE4054A33F86E6</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>CC8CEEF5B7274192979A4A87</key>
+		<dict>
+			<key>fileRef</key>
+			<string>DE71F5FAB9CE4DAD8BD8ADF1</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>CD28077AD3114BCFBF6557A0</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWExpectationType.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWExpectationType.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>CD5DF1D4027A4769BF37687F</key>
+		<dict>
+			<key>fileRef</key>
+			<string>FB06D836BABC486299179BC3</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>CE290FD6A17E4CAFA1C93E05</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWReceiveMatcher.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWReceiveMatcher.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>CF63CAA6537D4DA9A48D17BF</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWStub.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWStub.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>CFB357FB742A4CCA92DC9264</key>
+		<dict>
+			<key>fileRef</key>
+			<string>B242BB1D22DB4984BBC6713F</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>CFDB82BB94184C1480680855</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWMatcher.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWMatcher.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>D03761FBA3BE43DEB1C00B44</key>
+		<dict>
+			<key>children</key>
+			<array>
+				<string>ABDD6EDC8F04429284655550</string>
+				<string>8C28805DC9CE4D04A9ACB94A</string>
+				<string>207DD38E8CE6428395692A61</string>
+				<string>B242BB1D22DB4984BBC6713F</string>
+				<string>B435AF7769884E91AB73CD5D</string>
+				<string>7B5E4E0B270D4B4EA57627DF</string>
+				<string>7123B1D953464DEE81BE00F4</string>
+				<string>56111AC705124FBD86A812DE</string>
+				<string>E47E40CAA31B4A629523E911</string>
+				<string>F07A155BDD5F4E05AEAE5A4C</string>
+				<string>994952CBA1164AA0AB5ECF92</string>
+				<string>3BE4F2006D2549FBAF9E11D7</string>
+				<string>93689F693E7D4254970B3067</string>
+				<string>339A2561E847496986517189</string>
+				<string>7BA2C5C5CD1E40749907E540</string>
+				<string>A16DDD5930E44515995F48D2</string>
+				<string>758788320B604127AB6D71AF</string>
+				<string>2D615CE341B649CAAFD3C3F0</string>
+				<string>89456FF2B40B47BA8BF5DACD</string>
+				<string>A23D03232D7D4DE39A0CAC1C</string>
+				<string>CB03A674DD804F06B9A246F4</string>
+				<string>56CB9EBA7B2F4CD2AEA48FA4</string>
+				<string>E873B3C9003D480AACF91BA8</string>
+				<string>1E74DBDED95043A78B153F0A</string>
+				<string>85863A4FF4EE4FF1BCCA8D2F</string>
+				<string>AEEC4FCA0EE84595B0D042FA</string>
+				<string>6DEACE39915A4A07AF31B30F</string>
+				<string>64EE5B1A96DC42E2AB6DB38D</string>
+				<string>F270DBB48F424AAEA85E5D78</string>
+				<string>DECD7B745DBA4DB1AB8A7DEF</string>
+				<string>780EA16869A14B67A3FE5520</string>
+				<string>5EF99BA5B0FC42C599F51908</string>
+				<string>43D9DF7068C341FA82EF3BBF</string>
+				<string>A77CE17424AE4891AD99CB18</string>
+				<string>17A5329A7A6F4CF9B8E2053A</string>
+				<string>54AFD7DFF4C24784B4475584</string>
+				<string>C7BA95175BB34B8A96C8233C</string>
+				<string>6A4C5227A2A84F9CAA6170AC</string>
+				<string>96FDEBBC02794B24941AC94E</string>
+				<string>50452B331CE74129B2C87321</string>
+				<string>1A6EB900EBC641E59A8F54EE</string>
+				<string>85129A108F6C4BEA977D738D</string>
+				<string>178727151CB74C4093D8A3B0</string>
+				<string>09D53352FF9A4BC9A730F2E4</string>
+				<string>F48F4447792940CEAAC9C645</string>
+				<string>3B3D7FEC07A74FC5A83BC3D4</string>
+				<string>683CB37755C640A283CCDE57</string>
+				<string>8E3E49B41A8040B5B356A23D</string>
+				<string>B12137D2AAC2407C85CF44FE</string>
+				<string>C7BAA02ADCDB41C4BC9CD61D</string>
+				<string>DE71F5FAB9CE4DAD8BD8ADF1</string>
+				<string>BECC1C4339D44513964D565C</string>
+				<string>DC609184E1E6409D9B356C5F</string>
+				<string>F06AB2CC47FB40BDBB77745F</string>
+				<string>723E107AAD7445F08841E535</string>
+				<string>BAEEC73B2A3C422386178E56</string>
+				<string>C2D1A07AD4EB4257A5377F10</string>
+				<string>0C99EEE5B5E8497F96E3E664</string>
+				<string>2212F02EE9CA473C8DC1FDBC</string>
+				<string>28B811EAFE094379B1EA5B09</string>
+				<string>F841BF91ABEA40A7BB4C6BC5</string>
+				<string>D18A11E15AEE4054A33F86E6</string>
+				<string>B6111BFB2DF74A8B8F68C9C5</string>
+				<string>68B5B3A90DD94E17A353DD0F</string>
+				<string>E8C6AB0A19444451875C7918</string>
+				<string>1B854F55159B474F81E389F7</string>
+				<string>142E86E1894846BAB099FD1C</string>
+				<string>0F789F646EF04482B108F1B8</string>
+				<string>78B2F31072B94DDCA01963F0</string>
+				<string>D0BF6060C7FE4274B0C6215A</string>
+				<string>7BB183382EAF4B9BB7495F08</string>
+				<string>14E6E400B4774FF5BF6EA637</string>
+				<string>4AA292CBD4F04C19A92E764C</string>
+				<string>CD28077AD3114BCFBF6557A0</string>
+				<string>207EFF7EF3D747ADBB74F8F7</string>
+				<string>2689A143F62C4BFEB0E46715</string>
+				<string>E3E79291AF6B4AF2A1E645EF</string>
+				<string>6599F55AEF0F4E7EA053A540</string>
+				<string>FB06D836BABC486299179BC3</string>
+				<string>0B145338741D48C09288D9AA</string>
+				<string>68DFB2A225414518B6181F2F</string>
+				<string>AEF7DD1C93114439A178B54A</string>
+				<string>74B1F9A4D67B4B5F899D5FF8</string>
+				<string>14DD803CC31B48DABF80B1D2</string>
+				<string>B732906FEF69419DB52D3FE5</string>
+				<string>83B94888F4BB4D11888D4B31</string>
+				<string>B384DD84A01743E095D3F164</string>
+				<string>520E95EBBC394C3F923EE580</string>
+				<string>66A9488311854D2AAAE53727</string>
+				<string>528F64D05B0A44889EB5936B</string>
+				<string>D1DAE958A1EA41538AB7D3E4</string>
+				<string>DB0F3294030D4A59BB11FD4E</string>
+				<string>D9F96E772DF948BA93924F44</string>
+				<string>83280DFD41BA40EE977B68D1</string>
+				<string>390CE871AD2047CEA53AA4CB</string>
+				<string>61BEAA0160CC4D82A4218EF8</string>
+				<string>D1C92E6AAC4C4D0CAD71F95B</string>
+				<string>A99288FD33DE4CE685B552F0</string>
+				<string>CFDB82BB94184C1480680855</string>
+				<string>96E17864CEBB410D8D375EF4</string>
+				<string>76CAAD3F09B3478CB355B1B3</string>
+				<string>D854D321A93342B6BA9B4ECE</string>
+				<string>1339ADAC4D5E4E9B917FC0F9</string>
+				<string>697EAABAD88A4BEAA6D4EBFA</string>
+				<string>44AB36628E9C48D3A83A02CC</string>
+				<string>43739E359AAD44C884BBA1ED</string>
+				<string>87EBA85A60924CF9AC3F7AB1</string>
+				<string>744F17C2722B4885915BBB72</string>
+				<string>B74BA505CA844E128AC14CA9</string>
+				<string>5EBF4C000D2D4986B8E85358</string>
+				<string>97F84C90658D4F94A47359F7</string>
+				<string>CAC123F53F304E4E9E4F33B0</string>
+				<string>3C7B9F5DE3D54DF09D62B5F2</string>
+				<string>9F13DE642E9E426BA47366A0</string>
+				<string>5B964674CAE043D1B5CC8604</string>
+				<string>F4D125E645BB45109A492665</string>
+				<string>5056C1D29AEC4B48A4ACC97F</string>
+				<string>50CC3F3D5D6D4DA588399F04</string>
+				<string>1217927160754144B1CCAA23</string>
+				<string>178B88F1FB0349809A7CAE41</string>
+				<string>D0BEA9A1434D409697AC9ABE</string>
+				<string>73093A9707EB4D9EA02F5ED3</string>
+				<string>C5F6740A95FB440F82ED7AD7</string>
+				<string>3F2F0DF0E4284ABD867A0EF8</string>
+				<string>37088D73D7244DAE882E7758</string>
+				<string>E94813AE58D64A89B2C16CB5</string>
+				<string>CE290FD6A17E4CAFA1C93E05</string>
+				<string>BEBAA666B3314B8FB9CA2C5E</string>
+				<string>8DCC19C7BC204A42A653111E</string>
+				<string>7A1B725AA6F04B928A32F262</string>
+				<string>CC18BB57A90948DBBD6E5357</string>
+				<string>73DECDA49BD4408982BCD9F4</string>
+				<string>1D809AFE791E48B9995B43DE</string>
+				<string>DB082B7EFA924B56B20AE3AA</string>
+				<string>92BEEB972E4C447FBA64B931</string>
+				<string>11C410558485493A8B884190</string>
+				<string>72063726BC0E47E7B9E59AF6</string>
+				<string>68A39E0ADF914B70BE152A63</string>
+				<string>DE4B4A99FD8D4EDEB130920D</string>
+				<string>12D26D374C7E49C5A4B97318</string>
+				<string>E7E283CE27874F26837945B9</string>
+				<string>CF63CAA6537D4DA9A48D17BF</string>
+				<string>34609598FBE3445CB87B414F</string>
+				<string>515F8BD903894811BF685EFE</string>
+				<string>42369289D30C49B38A73D9A4</string>
+				<string>E2231E8B728F4C3BA0CDAFB4</string>
+				<string>F43EA10189834AEC82EA88EE</string>
+				<string>38724B756D474ED1B3D459C4</string>
+				<string>A38C647BE64F4EAA83B2EAD6</string>
+				<string>035D8E0B00E249D9AE526676</string>
+				<string>66EC2D246A54480FAD799A9B</string>
+				<string>20E8B27A25194F808D5C3826</string>
+				<string>385496562A5740D38FE4137D</string>
+				<string>A91FC77036BF4E7A874B38BF</string>
+				<string>1CC652B5129B46D3A01DD0E6</string>
+				<string>2E6F401A858E453CA270D346</string>
+				<string>CACB01B8A3E8454588137D3C</string>
+				<string>C19C17BF5EA040F2B1C33BC3</string>
+				<string>E2C0C61D7EE34193AB91BAFA</string>
+				<string>C84597A5631641208ADE4ECD</string>
+				<string>79E02D8EE4BC4B91AA8807ED</string>
+				<string>EC425E90B7D6462A82604D77</string>
+				<string>523B0150F9154580A2E07812</string>
+				<string>6C019414A856426CB2D4C4FE</string>
+				<string>4C9D0A0A71344D77AF96AF87</string>
+				<string>E895ECD0996E4ABABBED3C01</string>
+				<string>E0B0B80EA0FA45D5B807F34C</string>
+				<string>3EA9467F531F40E491793ADC</string>
+				<string>406B06FC788141B7AA945C2E</string>
+				<string>004ABF01C1C4452F9A8CDA2C</string>
+				<string>F48DDE649B374701834C560A</string>
+			</array>
+			<key>isa</key>
+			<string>PBXGroup</string>
+			<key>name</key>
+			<string>Kiwi</string>
+			<key>sourceTree</key>
+			<string>&lt;group&gt;</string>
+		</dict>
+		<key>D044F0307C464A6CA7C9719B</key>
+		<dict>
+			<key>fileRef</key>
+			<string>A91FC77036BF4E7A874B38BF</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>D0BEA9A1434D409697AC9ABE</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWProbe.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWProbe.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>D0BF6060C7FE4274B0C6215A</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWExampleSuite.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWExampleSuite.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>D18A11E15AEE4054A33F86E6</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWEqualMatcher.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWEqualMatcher.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>D1C92E6AAC4C4D0CAD71F95B</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWItNode.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWItNode.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>D1DAE958A1EA41538AB7D3E4</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWInequalityMatcher.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWInequalityMatcher.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>D1EE02E6D0CE4FD19201C73A</key>
+		<dict>
+			<key>fileRef</key>
+			<string>AEF7DD1C93114439A178B54A</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>D3F1A549FA4B4204BF67413F</key>
+		<dict>
+			<key>fileRef</key>
+			<string>780EA16869A14B67A3FE5520</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>D3F2A3D24BEA41BBAC8CD89B</key>
+		<dict>
+			<key>fileRef</key>
+			<string>DB082B7EFA924B56B20AE3AA</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>D55DA1F0B8B649718A3808A8</key>
+		<dict>
+			<key>fileRef</key>
+			<string>7B5E4E0B270D4B4EA57627DF</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>D5CDA56B6CBF4F26812A3D6D</key>
+		<dict>
+			<key>fileRef</key>
+			<string>73093A9707EB4D9EA02F5ED3</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>D6E518FF34284EFDA40100DB</key>
+		<dict>
+			<key>fileRef</key>
+			<string>E873B3C9003D480AACF91BA8</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>D8003AED11434FE6BC8C73B6</key>
+		<dict>
+			<key>fileRef</key>
+			<string>528F64D05B0A44889EB5936B</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>D854D321A93342B6BA9B4ECE</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWMatcherFactory.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWMatcherFactory.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>D8E1A6D3975A498D9E0F5E03</key>
+		<dict>
+			<key>fileRef</key>
+			<string>178B88F1FB0349809A7CAE41</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>D9CE040EDD954ECD8F63D0AD</key>
+		<dict>
+			<key>fileRef</key>
+			<string>E47E40CAA31B4A629523E911</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>D9F96E772DF948BA93924F44</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWIntercept.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWIntercept.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>DA53427E4B56431BA6181705</key>
+		<dict>
+			<key>fileRef</key>
+			<string>DE4B4A99FD8D4EDEB130920D</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>DB082B7EFA924B56B20AE3AA</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWSpec.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWSpec.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>DB0F3294030D4A59BB11FD4E</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWInequalityMatcher.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWInequalityMatcher.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>DB399D82300E4E9F83306756</key>
+		<dict>
+			<key>fileRef</key>
+			<string>035D8E0B00E249D9AE526676</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>DC609184E1E6409D9B356C5F</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWConformToProtocolMatcher.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWConformToProtocolMatcher.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>DCC99CDB3AAD4838B829FA18</key>
+		<dict>
+			<key>children</key>
+			<array>
+				<string>A4661B2DA61E44B2982860D4</string>
+				<string>12FF266823204BB6BDC2A814</string>
+				<string>E66180A7881E49CF83090FD4</string>
+				<string>14067FBC27094A558F83BE08</string>
+				<string>2C7FD3B2CD5940E8913EFFA2</string>
+			</array>
+			<key>isa</key>
+			<string>PBXGroup</string>
+			<key>sourceTree</key>
+			<string>&lt;group&gt;</string>
+		</dict>
+		<key>DE4B4A99FD8D4EDEB130920D</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWStringUtilities.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWStringUtilities.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>DE684B7FCED1463E83B86D06</key>
+		<dict>
+			<key>fileRef</key>
+			<string>F07A155BDD5F4E05AEAE5A4C</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>DE71F5FAB9CE4DAD8BD8ADF1</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWChangeMatcher.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWChangeMatcher.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>DECD7B745DBA4DB1AB8A7DEF</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWBeNonNilMatcher.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWBeNonNilMatcher.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>DFA5AFC241D44F2BA15B2923</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>wrapper.framework</string>
+			<key>name</key>
+			<string>SenTestingKit.framework</string>
+			<key>path</key>
+			<string>Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/System/Library/Frameworks/SenTestingKit.framework</string>
+			<key>sourceTree</key>
+			<string>DEVELOPER_DIR</string>
+		</dict>
+		<key>E073FFE623934AE5B273371D</key>
+		<dict>
+			<key>fileRef</key>
+			<string>50CC3F3D5D6D4DA588399F04</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>E0B0B80EA0FA45D5B807F34C</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>NSObject+KiwiVerifierAdditions.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/NSObject+KiwiVerifierAdditions.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>E0B949617F2649179EA1B5F1</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>text.xcconfig</string>
+			<key>name</key>
+			<string>Pods-MovieLibraryTests.xcconfig</string>
+			<key>path</key>
+			<string>Pods-MovieLibraryTests.xcconfig</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>E1CC2DA65A594244AA21CEC1</key>
+		<dict>
+			<key>fileRef</key>
+			<string>F43EA10189834AEC82EA88EE</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>E1D5EF7DDE07452081A8B9B5</key>
+		<dict>
+			<key>fileRef</key>
+			<string>A38C647BE64F4EAA83B2EAD6</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>E2231E8B728F4C3BA0CDAFB4</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWUserDefinedMatcher.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWUserDefinedMatcher.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>E2383366B3964EEA9D88455F</key>
+		<dict>
+			<key>buildSettings</key>
+			<dict>
+				<key>IPHONEOS_DEPLOYMENT_TARGET</key>
+				<string>4.3</string>
+			</dict>
+			<key>isa</key>
+			<string>XCBuildConfiguration</string>
+			<key>name</key>
+			<string>Release</string>
+		</dict>
+		<key>E2C0C61D7EE34193AB91BAFA</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>NSNumber+KiwiAdditions.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/NSNumber+KiwiAdditions.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>E351E52A5CD840AC9F6363C8</key>
+		<dict>
+			<key>baseConfigurationReference</key>
+			<string>E0B949617F2649179EA1B5F1</string>
+			<key>buildSettings</key>
+			<dict>
+				<key>ALWAYS_SEARCH_USER_PATHS</key>
+				<string>NO</string>
+				<key>ARCHS</key>
+				<string>$(ARCHS_STANDARD_32_BIT)</string>
+				<key>COPY_PHASE_STRIP</key>
+				<string>YES</string>
+				<key>DSTROOT</key>
+				<string>/tmp/xcodeproj.dst</string>
+				<key>GCC_C_LANGUAGE_STANDARD</key>
+				<string>gnu99</string>
+				<key>GCC_PRECOMPILE_PREFIX_HEADER</key>
+				<string>YES</string>
+				<key>GCC_PREFIX_HEADER</key>
+				<string>Pods-MovieLibraryTests-prefix.pch</string>
+				<key>GCC_VERSION</key>
+				<string>com.apple.compilers.llvm.clang.1_0</string>
+				<key>INSTALL_PATH</key>
+				<string>$(BUILT_PRODUCTS_DIR)</string>
+				<key>IPHONEOS_DEPLOYMENT_TARGET</key>
+				<string>4.3</string>
+				<key>OTHER_CFLAGS</key>
+				<array>
+					<string>-DNS_BLOCK_ASSERTIONS=1</string>
+					<string>$(inherited)</string>
+				</array>
+				<key>OTHER_CPLUSPLUSFLAGS</key>
+				<array>
+					<string>-DNS_BLOCK_ASSERTIONS=1</string>
+					<string>$(inherited)</string>
+				</array>
+				<key>OTHER_LDFLAGS</key>
+				<string></string>
+				<key>PODS_HEADERS_SEARCH_PATHS</key>
+				<string>${PODS_BUILD_HEADERS_SEARCH_PATHS}</string>
+				<key>PODS_ROOT</key>
+				<string>${SRCROOT}</string>
+				<key>PRODUCT_NAME</key>
+				<string>$(TARGET_NAME)</string>
+				<key>PUBLIC_HEADERS_FOLDER_PATH</key>
+				<string>$(TARGET_NAME)</string>
+				<key>SDKROOT</key>
+				<string>iphoneos</string>
+				<key>SKIP_INSTALL</key>
+				<string>YES</string>
+				<key>VALIDATE_PRODUCT</key>
+				<string>YES</string>
+			</dict>
+			<key>isa</key>
+			<string>XCBuildConfiguration</string>
+			<key>name</key>
+			<string>Release</string>
+		</dict>
+		<key>E3A06A56F4984753BE31406C</key>
+		<dict>
+			<key>fileRef</key>
+			<string>92BEEB972E4C447FBA64B931</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>E3E79291AF6B4AF2A1E645EF</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWFormatter.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWFormatter.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>E47E40CAA31B4A629523E911</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWAfterEachNode.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWAfterEachNode.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>E574C0FC3FF648E4B762FDEA</key>
+		<dict>
+			<key>fileRef</key>
+			<string>54AFD7DFF4C24784B4475584</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>E66180A7881E49CF83090FD4</key>
+		<dict>
+			<key>children</key>
+			<array>
+				<string>89FFDADB5C0B4F4A88C29B33</string>
+			</array>
+			<key>isa</key>
+			<string>PBXGroup</string>
+			<key>name</key>
+			<string>Products</string>
+			<key>sourceTree</key>
+			<string>&lt;group&gt;</string>
+		</dict>
+		<key>E739608C25C54B538941C664</key>
+		<dict>
+			<key>fileRef</key>
+			<string>56CB9EBA7B2F4CD2AEA48FA4</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>E73D0771D3724F989696A873</key>
+		<dict>
+			<key>fileRef</key>
+			<string>DC609184E1E6409D9B356C5F</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>E7E283CE27874F26837945B9</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWStub.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWStub.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>E873B3C9003D480AACF91BA8</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWBeIdenticalToMatcher.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWBeIdenticalToMatcher.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>E895ECD0996E4ABABBED3C01</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>NSObject+KiwiVerifierAdditions.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/NSObject+KiwiVerifierAdditions.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>E89FF05F0D7546E8AA433B3B</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>name</key>
+			<string>Pods-MovieLibraryTests-resources.sh</string>
+			<key>path</key>
+			<string>Pods-MovieLibraryTests-resources.sh</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>E8C6AB0A19444451875C7918</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWExampleGroupBuilder.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWExampleGroupBuilder.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>E94813AE58D64A89B2C16CB5</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWReceiveMatcher.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWReceiveMatcher.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>EAE3826E459A4F4786D9B6DF</key>
+		<dict>
+			<key>fileRef</key>
+			<string>C7BAA02ADCDB41C4BC9CD61D</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>EC425E90B7D6462A82604D77</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>NSObject+KiwiSpyAdditions.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/NSObject+KiwiSpyAdditions.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>EDD5B2918C994893832DAF83</key>
+		<dict>
+			<key>fileRef</key>
+			<string>BAEEC73B2A3C422386178E56</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>F06AB2CC47FB40BDBB77745F</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWContainMatcher.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWContainMatcher.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>F07A155BDD5F4E05AEAE5A4C</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWAny.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWAny.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>F21C4314B6D64696835EAFEE</key>
+		<dict>
+			<key>fileRef</key>
+			<string>C2D1A07AD4EB4257A5377F10</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>F270DBB48F424AAEA85E5D78</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWBeNilMatcher.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWBeNilMatcher.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>F43EA10189834AEC82EA88EE</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWValue.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWValue.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>F48DDE649B374701834C560A</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>NSValue+KiwiAdditions.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/NSValue+KiwiAdditions.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>F48F4447792940CEAAC9C645</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWBlockRaiseMatcher.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWBlockRaiseMatcher.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>F49E4183FD4B4DF693EB981F</key>
+		<dict>
+			<key>fileRef</key>
+			<string>CE290FD6A17E4CAFA1C93E05</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>F4D125E645BB45109A492665</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.objc</string>
+			<key>name</key>
+			<string>KWNull.m</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWNull.m</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>F4F4CFC0DF2845139016ECDA</key>
+		<dict>
+			<key>fileRef</key>
+			<string>523B0150F9154580A2E07812</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>F5238E5FD4AE4F9C9B2FDEC0</key>
+		<dict>
+			<key>fileRef</key>
+			<string>83280DFD41BA40EE977B68D1</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>F65058A4F839415998F4B986</key>
+		<dict>
+			<key>fileRef</key>
+			<string>994952CBA1164AA0AB5ECF92</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>F74DA2C1BB41479EA3CA21CD</key>
+		<dict>
+			<key>fileRef</key>
+			<string>97F84C90658D4F94A47359F7</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>F841BF91ABEA40A7BB4C6BC5</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWEqualMatcher.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWEqualMatcher.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>FA0D4FC026424AB4BD5DFB61</key>
+		<dict>
+			<key>buildSettings</key>
+			<dict>
+				<key>IPHONEOS_DEPLOYMENT_TARGET</key>
+				<string>4.3</string>
+			</dict>
+			<key>isa</key>
+			<string>XCBuildConfiguration</string>
+			<key>name</key>
+			<string>Debug</string>
+		</dict>
+		<key>FB06D836BABC486299179BC3</key>
+		<dict>
+			<key>includeInIndex</key>
+			<string>1</string>
+			<key>isa</key>
+			<string>PBXFileReference</string>
+			<key>lastKnownFileType</key>
+			<string>sourcecode.c.h</string>
+			<key>name</key>
+			<string>KWFutureObject.h</string>
+			<key>path</key>
+			<string>Kiwi/Classes/KWFutureObject.h</string>
+			<key>sourceTree</key>
+			<string>SOURCE_ROOT</string>
+		</dict>
+		<key>FD62BE4D177F4F40A5642146</key>
+		<dict>
+			<key>fileRef</key>
+			<string>83B94888F4BB4D11888D4B31</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+		<key>FFF071314FFB4A5699FC66C3</key>
+		<dict>
+			<key>fileRef</key>
+			<string>2212F02EE9CA473C8DC1FDBC</string>
+			<key>isa</key>
+			<string>PBXBuildFile</string>
+			<key>settings</key>
+			<dict/>
+		</dict>
+	</dict>
+	<key>rootObject</key>
+	<string>BD525FCE43454E3DA87A7038</string>
+</dict>
+</plist>
Pods/Manifest.lock
@@ -0,0 +1,10 @@
+PODS:
+  - Kiwi (2.0.6)
+
+DEPENDENCIES:
+  - Kiwi
+
+SPEC CHECKSUMS:
+  Kiwi: 56082a80f942de4d10423d8d8a599ab30cf50228
+
+COCOAPODS: 0.19.1
Pods/Pods-MovieLibraryTests-acknowledgements.markdown
@@ -0,0 +1,34 @@
+# Acknowledgements
+This application makes use of the following third party libraries:
+
+## Kiwi
+
+Copyright (c) 2010, Allen Ding
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+this list of conditions and the following disclaimer in the documentation
+and/or other materials provided with the distribution.
+
+3.  Neither the name of Allen Ding nor the names of any contributors may be
+used to endorse or promote products derived from this software without specific
+prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Generated by CocoaPods - http://cocoapods.org
Pods/Pods-MovieLibraryTests-acknowledgements.plist
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>PreferenceSpecifiers</key>
+	<array>
+		<dict>
+			<key>FooterText</key>
+			<string>This application makes use of the following third party libraries:</string>
+			<key>Title</key>
+			<string>Acknowledgements</string>
+			<key>Type</key>
+			<string>PSGroupSpecifier</string>
+		</dict>
+		<dict>
+			<key>FooterText</key>
+			<string>Copyright (c) 2010, Allen Ding
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+this list of conditions and the following disclaimer in the documentation
+and/or other materials provided with the distribution.
+
+3.  Neither the name of Allen Ding nor the names of any contributors may be
+used to endorse or promote products derived from this software without specific
+prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+</string>
+			<key>Title</key>
+			<string>Kiwi</string>
+			<key>Type</key>
+			<string>PSGroupSpecifier</string>
+		</dict>
+		<dict>
+			<key>FooterText</key>
+			<string>Generated by CocoaPods - http://cocoapods.org</string>
+			<key>Title</key>
+			<string></string>
+			<key>Type</key>
+			<string>PSGroupSpecifier</string>
+		</dict>
+	</array>
+	<key>StringsTable</key>
+	<string>Acknowledgements</string>
+	<key>Title</key>
+	<string>Acknowledgements</string>
+</dict>
+</plist>
Pods/Pods-MovieLibraryTests-dummy.m
@@ -0,0 +1,5 @@
+#import <Foundation/Foundation.h>
+@interface PodsDummy_Pods_MovieLibraryTests : NSObject
+@end
+@implementation PodsDummy_Pods_MovieLibraryTests
+@end
Pods/Pods-MovieLibraryTests-environment.h
@@ -0,0 +1,14 @@
+
+// To check if a library is compiled with CocoaPods you
+// can use the `COCOAPODS` macro definition which is
+// defined in the xcconfigs so it is available in
+// headers also when they are imported in the client
+// project.
+
+
+// Kiwi
+#define COCOAPODS_POD_AVAILABLE_Kiwi
+#define COCOAPODS_VERSION_MAJOR_Kiwi 2
+#define COCOAPODS_VERSION_MINOR_Kiwi 0
+#define COCOAPODS_VERSION_PATCH_Kiwi 6
+
Pods/Pods-MovieLibraryTests-prefix.pch
@@ -0,0 +1,5 @@
+#ifdef __OBJC__
+#import <UIKit/UIKit.h>
+#endif
+
+#import "Pods-MovieLibraryTests-environment.h"
Pods/Pods-MovieLibraryTests-resources.sh
@@ -0,0 +1,27 @@
+#!/bin/sh
+
+install_resource()
+{
+  case $1 in
+    *.storyboard)
+      echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc ${PODS_ROOT}/$1 --sdk ${SDKROOT}"
+      ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc" "${PODS_ROOT}/$1" --sdk "${SDKROOT}"
+      ;;
+    *.xib)
+        echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib ${PODS_ROOT}/$1 --sdk ${SDKROOT}"
+      ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib" "${PODS_ROOT}/$1" --sdk "${SDKROOT}"
+      ;;
+    *.framework)
+      echo "rsync -rp ${PODS_ROOT}/$1 ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
+      rsync -rp "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
+      ;;
+    *.xcdatamodeld)
+      echo "xcrun momc ${PODS_ROOT}/$1 ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename $1 .xcdatamodeld`.momd"
+      xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename $1 .xcdatamodeld`.momd"
+      ;;
+    *)
+      echo "rsync -av --exclude '*/.svn/*' ${PODS_ROOT}/$1 ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
+      rsync -av --exclude '*/.svn/*' "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
+      ;;
+  esac
+}
Pods/Pods-MovieLibraryTests.xcconfig
@@ -0,0 +1,9 @@
+ALWAYS_SEARCH_USER_PATHS = YES
+FRAMEWORK_SEARCH_PATHS = $(inherited) "$(SDKROOT)/Developer/Library/Frameworks" "$(DEVELOPER_LIBRARY_DIR)/Frameworks"
+GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
+HEADER_SEARCH_PATHS = ${PODS_HEADERS_SEARCH_PATHS}
+OTHER_LDFLAGS = -ObjC -framework SenTestingKit
+PODS_BUILD_HEADERS_SEARCH_PATHS = "${PODS_ROOT}/BuildHeaders" "${PODS_ROOT}/BuildHeaders/Kiwi"
+PODS_HEADERS_SEARCH_PATHS = ${PODS_PUBLIC_HEADERS_SEARCH_PATHS}
+PODS_PUBLIC_HEADERS_SEARCH_PATHS = "${PODS_ROOT}/Headers" "${PODS_ROOT}/Headers/Kiwi"
+PODS_ROOT = ${SRCROOT}/Pods
\ No newline at end of file
Gemfile
@@ -1,4 +1,3 @@
-# A sample Gemfile
 source "https://rubygems.org"
 
-# gem "rails"
+gem 'cocoapods'
Gemfile.lock
@@ -0,0 +1,55 @@
+GEM
+  remote: https://rubygems.org/
+  specs:
+    activesupport (3.2.13)
+      i18n (= 0.6.1)
+      multi_json (~> 1.0)
+    addressable (2.3.4)
+    claide (0.2.0)
+    cocoapods (0.19.1)
+      activesupport (~> 3.2.13)
+      claide (~> 0.2.0)
+      cocoapods-core (= 0.19.1)
+      cocoapods-downloader (~> 0.1.0)
+      colored (~> 1.2)
+      escape (~> 0.0.4)
+      faraday (~> 0.8.1)
+      json (~> 1.7.3)
+      octokit (~> 1.7)
+      open4 (~> 1.3.0)
+      rake (~> 10.0.0)
+      xcodeproj (~> 0.5.5)
+    cocoapods-core (0.19.1)
+      activesupport (~> 3.2.13)
+      rake (~> 10.0.0)
+    cocoapods-downloader (0.1.0)
+    colored (1.2)
+    escape (0.0.4)
+    faraday (0.8.7)
+      multipart-post (~> 1.1)
+    faraday_middleware (0.9.0)
+      faraday (>= 0.7.4, < 0.9)
+    hashie (2.0.5)
+    i18n (0.6.1)
+    json (1.7.7)
+    multi_json (1.7.3)
+    multipart-post (1.2.0)
+    netrc (0.7.7)
+    octokit (1.24.0)
+      addressable (~> 2.2)
+      faraday (~> 0.8)
+      faraday_middleware (~> 0.9)
+      hashie (~> 2.0)
+      multi_json (~> 1.3)
+      netrc (~> 0.7.7)
+    open4 (1.3.0)
+    rake (10.0.4)
+    xcodeproj (0.5.5)
+      activesupport (~> 3.2.13)
+      colored (~> 1.2)
+
+PLATFORMS
+  ruby
+
+DEPENDENCIES
+  cocoapods
Podfile
@@ -0,0 +1,5 @@
+platform :ios
+
+target :MovieLibraryTests, :exclusive => true do
+  pod 'Kiwi'
+end
Podfile.lock
@@ -0,0 +1,10 @@
+PODS:
+  - Kiwi (2.0.6)
+
+DEPENDENCIES:
+  - Kiwi
+
+SPEC CHECKSUMS:
+  Kiwi: 56082a80f942de4d10423d8d8a599ab30cf50228
+
+COCOAPODS: 0.19.1