public IObservable<Unit> Fetch (Request request)
        {
            return Observable.Create<Unit> (o => {
                var description = request.DescriptionAs<ScaledDescription> ();
                var url = new NSUrl (description.AbsoluteSourceUrl.AbsoluteUri);
                var disp = new CancellationDisposable ();
                var token = disp.Token;

                Task.Factory.StartNew (() => {
                    using (var source = CGImageSource.FromUrl (url)) {
                        if (source.Handle == IntPtr.Zero)
                            throw new Exception (string.Format ("Could not create source for '{0}'", url));

                        var sourceSize = ImageHelper.Measure (source);
                        int maxPixelSize = GetMaxPixelSize (sourceSize, description.Size);

                        using (var scaled = CreateThumbnail (source, maxPixelSize, token))
                        using (var cropped = ScaleAndCrop (scaled, description.Size, description.Mode, token))
                            SaveToRequest (cropped, source.TypeIdentifier, request);

                        o.OnCompleted ();
                    }
                }, token).RouteExceptions (o);

                return disp;
            });
        }
        public IObservable<Unit> Fetch (Request request)
        {
            var description = request.DescriptionAs<AssetDescription> ();

            return (description.Kind == AssetDescription.AssetImageKind.Thumbnail)
                ? SaveThumbnail (request)
                : SaveFullResolutionImage (request);
        }