namespace Ploeh.AutoFixture { using Kernel; using System; public class PostProcessWhereIsACustomization : ICustomization where T : class { readonly PostProcessSpecimensBehavior _behavior; public PostProcessWhereIsACustomization( Action action ) { _behavior = new PostProcessSpecimensBehavior( action ); } void ICustomization.Customize( IFixture fixture ) { fixture.Behaviors.Add( _behavior ); } class PostProcessSpecimensBehavior : ISpecimenBuilderTransformation { readonly Action _applyActionIfSpecimenIsOfTypeT; public PostProcessSpecimensBehavior( Action action ) { _applyActionIfSpecimenIsOfTypeT = x => { var asT = x as T; if ( asT != null ) action( asT ); }; } ISpecimenBuilder ISpecimenBuilderTransformation.Transform( ISpecimenBuilder builder ) { return new SpecimenBuilderPostProcessor( builder, _applyActionIfSpecimenIsOfTypeT ); } class SpecimenBuilderPostProcessor : ISpecimenBuilderNode { readonly ISpecimenBuilder _builder; readonly Action _postProcess; public SpecimenBuilderPostProcessor( ISpecimenBuilder builder, Action initializationAction ) { _postProcess = initializationAction; _builder = builder; } object ISpecimenBuilder.Create( object request, ISpecimenContext context ) { var specimen = _builder.Create( request, context ); _postProcess( specimen ); return specimen; } ISpecimenBuilderNode ISpecimenBuilderNode.Compose( System.Collections.Generic.IEnumerable builders ) { return new SpecimenBuilderPostProcessor( new CompositeSpecimenBuilder( builders ), _postProcess ); } System.Collections.Generic.IEnumerator System.Collections.Generic.IEnumerable.GetEnumerator() { yield return _builder; } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { yield return _builder; } } } } }