private static void SetUpInternal(IBuildUpStrategy buildUpStrategy, Action <string> logger)
        {
            _buildUpStrategy = buildUpStrategy;
            _logger          = logger;

            Log("Setting up UIStoryboard for UIViewController dependency injection.");

            CallbackDelegateNamed d = Inject;
            var newImpl             = Marshal.GetFunctionPointerForDelegate(d);

            _originalImpl = method_setImplementation(Method, newImpl);
        }
        /// <summary>
        /// Sets up dependency injection using the provided
        /// <see cref="F23.Mobile.iOS.DependencySwizzler.IBuildUpStrategy"/>
        /// and logging callback.
        /// </summary>
        /// <param name="buildUpStrategy">The <see cref="F23.Mobile.iOS.DependencySwizzler.IBuildUpStrategy" />
        /// used to build up instances of <see cref="UIKit.UIViewController"/>.</param>
        /// <param name="logger"">A callback for logging messages.</param>
        public static void SetUp(IBuildUpStrategy buildUpStrategy, Action <string> logger)
        {
            if (buildUpStrategy == null)
            {
                throw new ArgumentNullException("buildUpStrategy");
            }

            lock (_lock)
            {
                ResetInternal();

                SetUpInternal(buildUpStrategy, logger);
            }
        }
        private static void ResetInternal()
        {
            if (_originalImpl == IntPtr.Zero)
            {
                return;
            }

            Log("Resetting UIStoryboard. No more dependency injection... :(");

            method_setImplementation(Method, _originalImpl);

            _originalImpl    = IntPtr.Zero;
            _buildUpStrategy = null;
            _logger          = null;
        }
 /// <summary>
 /// Sets up dependency injection using the provided
 /// <see cref="F23.Mobile.iOS.DependencySwizzler.IBuildUpStrategy"/>.
 /// </summary>
 /// <param name="buildUpStrategy">The <see cref="F23.Mobile.iOS.DependencySwizzler.IBuildUpStrategy" />
 /// used to build up instances of <see cref="UIKit.UIViewController"/>.</param>
 public static void SetUp(IBuildUpStrategy buildUpStrategy)
 {
     SetUp(buildUpStrategy, null);
 }