protected void SetupStandardHierarchicalTestStructure(
            string[] testMethodAttrs, string[] testSetupAttrs, string[] fixtureSetupAttrs,
            string[] assemblySetupAttrs, FixtureConstuctorSemantics fixtureConstructorSemantics)
        {
            this.AddRepository(testMethodAttrs, method => method, null, true, true);

            switch (fixtureConstructorSemantics)
            {
            case FixtureConstuctorSemantics.InstanceConstructorCalledOncePerFixture:
            {
                this.AddRepository(testSetupAttrs, method => method.DeclaringType,
                                   (method, prevType) => IsTypeAssignableIgnoreGenericArgs((Type)prevType, method.DeclaringType),
                                   false, false);
                var fixtureSetupMatcher = CreateAttributeMatcher(fixtureSetupAttrs);
                this.AddRepository(
                    method => fixtureSetupMatcher(method) ||
                    MatchTestClassConstructor(ConstructorKind.Both, method, testMethodAttrs),
                    method => method.DeclaringType, null, false, true);
            }
            break;

            case FixtureConstuctorSemantics.InstanceConstructorCalledOncePerTest:
            {
                var testSetupMatcher    = CreateAttributeMatcher(testSetupAttrs);
                var fixtureSetupMatcher = CreateAttributeMatcher(fixtureSetupAttrs);

                this.AddRepository(
                    method => testSetupMatcher(method) ||
                    MatchTestClassConstructor(ConstructorKind.Instance, method, testMethodAttrs) ||
                    MatchTestClassDispose(method, testMethodAttrs),
                    method => method.DeclaringType,
                    (method, prevType) => IsTypeAssignableIgnoreGenericArgs((Type)prevType, method.DeclaringType),
                    false, false);

                this.AddRepository(
                    method => fixtureSetupMatcher(method) ||
                    MatchTestClassConstructor(ConstructorKind.Static, method, testMethodAttrs),
                    method => method.DeclaringType, null, false, true);
            }
            break;
            }


            if (assemblySetupAttrs != null)
            {
                this.AddRepository(assemblySetupAttrs, method => method.DeclaringType.Assembly, null, false, true);
            }
        }
		protected void SetupStandardHierarchicalTestStructure(
			string[] testMethodAttrs, string[] testSetupAttrs, string[] fixtureSetupAttrs,
			string[] assemblySetupAttrs, FixtureConstuctorSemantics fixtureConstructorSemantics)
		{
			this.AddRepository(testMethodAttrs, method => method, null, true, true);

			switch (fixtureConstructorSemantics)
			{
				case FixtureConstuctorSemantics.InstanceConstructorCalledOncePerFixture:
					{
						this.AddRepository(testSetupAttrs, method => method.DeclaringType,
							(method, prevType) => IsTypeAssignableIgnoreGenericArgs((Type)prevType, method.DeclaringType),
							false, false);
						var fixtureSetupMatcher = CreateAttributeMatcher(fixtureSetupAttrs);
						this.AddRepository(
							method => fixtureSetupMatcher(method)
								|| MatchTestClassConstructor(ConstructorKind.Both, method, testMethodAttrs),
							method => method.DeclaringType, null, false, true);
					}
					break;
				case FixtureConstuctorSemantics.InstanceConstructorCalledOncePerTest:
					{
						var testSetupMatcher = CreateAttributeMatcher(testSetupAttrs);
						var fixtureSetupMatcher = CreateAttributeMatcher(fixtureSetupAttrs);

						this.AddRepository(
							method => testSetupMatcher(method)
								|| MatchTestClassConstructor(ConstructorKind.Instance, method, testMethodAttrs)
								|| MatchTestClassDispose(method, testMethodAttrs),
							method => method.DeclaringType,
							(method, prevType) => IsTypeAssignableIgnoreGenericArgs((Type)prevType, method.DeclaringType),
							false, false);

						this.AddRepository(
							method => fixtureSetupMatcher(method)
								|| MatchTestClassConstructor(ConstructorKind.Static, method, testMethodAttrs),
							method => method.DeclaringType, null, false, true);
					}
					break;
			}


			if (assemblySetupAttrs != null)
				this.AddRepository(assemblySetupAttrs, method => method.DeclaringType.Assembly, null, false, true);
		}