protected virtual MethodDefinitionExpression CreateParseResultMethod()
        {
            var client      = Expression.Parameter(FickleType.Define("PKWebServiceClient"), "client");
            var data        = Expression.Parameter(FickleType.Define("NSData"), "parseResult");
            var contentType = Expression.Parameter(typeof(string), "withContentType");
            var statusCode  = Expression.Parameter(typeof(int), "andStatusCode");
            var response    = FickleExpression.Variable("id", "response");
            var options     = FickleExpression.Property(client, "NSDictionary", "options");

            var parameters = new Expression[]
            {
                client,
                data,
                contentType,
                statusCode
            };

            var bodyExpressions = new List <Expression>();
            var delegateType    = new FickleDelegateType(FickleType.Define("id"), new FickleParameterInfo(client.Type, "client"), new FickleParameterInfo(FickleType.Define("NSData"), "data"));
            var block           = Expression.Variable(delegateType, "block");

            bodyExpressions.Add(Expression.Assign(block, FickleExpression.Call(options, FickleType.Define("id"), "objectForKey", Expression.Constant("$ParseResultBlock"))));
            bodyExpressions.Add(Expression.Assign(response, FickleExpression.Call(block, "id", "Invoke", new { client, data })).ToStatement());

            var setResponseStatus = Expression.IfThen
                                    (
                Expression.Equal(FickleExpression.Call(response, "id", "responseStatus", null), Expression.Constant(null, FickleType.Define("id"))),
                FickleExpression.Call(response, "setResponseStatus", FickleExpression.New("ResponseStatus", "init", null)).ToStatementBlock()
                                    );

            var populateResponseStatus = FickleExpression.Call(FickleExpression.Call(response, "id", "responseStatus", null), "setHttpStatus", statusCode);

            bodyExpressions.Add(setResponseStatus);
            bodyExpressions.Add(populateResponseStatus);
            bodyExpressions.Add(FickleExpression.Return(response));

            var body = FickleExpression.Block
                       (
                new[] { response, block },
                bodyExpressions.ToArray()
                       );

            return(new MethodDefinitionExpression
                   (
                       "webServiceClient",
                       parameters.ToReadOnlyCollection(),
                       FickleType.Define("id"),
                       body,
                       false,
                       null
                   ));
        }
        protected virtual MethodDefinitionExpression CreateParseResultMethod()
        {
            var client = Expression.Parameter(FickleType.Define("PKWebServiceClient"), "client");
            var data = Expression.Parameter(FickleType.Define("NSData"), "parseResult");
            var contentType = Expression.Parameter(typeof(string), "withContentType");
            var statusCode = Expression.Parameter(typeof(int), "andStatusCode");
            var response = FickleExpression.Variable(FickleType.Define("id"), "response");
            var options = FickleExpression.Property(client, "NSDictionary", "options");

            var parameters = new Expression[]
            {
                client,
                data,
                contentType,
                statusCode
            };

            var bodyExpressions = new List<Expression>();
            var delegateType = new FickleDelegateType(FickleType.Define("id"), new FickleParameterInfo(FickleType.Define("NSData"), "data"));
            var block = Expression.Variable(delegateType, "block");

            bodyExpressions.Add(Expression.Assign(block, FickleExpression.Call(options, FickleType.Define("id"), "objectForKey", Expression.Constant("$ParseResultBlock"))));
            bodyExpressions.Add(Expression.Assign(response,  FickleExpression.Call(block, "id", "Invoke", data)).ToStatement());

            var setResponseStatus = Expression.IfThen
            (
                Expression.Equal(FickleExpression.Call(response, "id", "responseStatus", null), Expression.Constant(null, FickleType.Define("id"))),
                FickleExpression.Call(response, "setResponseStatus", FickleExpression.New("ResponseStatus", "init", null)).ToStatement().ToBlock()
            );

            var populateResponseStatus = FickleExpression.Call(FickleExpression.Call(response, "id", "responseStatus", null), "setHttpStatus", statusCode);

            bodyExpressions.Add(setResponseStatus);
            bodyExpressions.Add(populateResponseStatus);
            bodyExpressions.Add(FickleExpression.Return(response));

            var body = FickleExpression.Block
            (
                new[] { response, block },
                bodyExpressions.ToArray()
            );

            return new MethodDefinitionExpression
            (
                "webServiceClient",
                new ReadOnlyCollection<Expression>(parameters),
                FickleType.Define("id"),
                body,
                false,
                null
            );
        }