public override PropertyTreeMetaObject Bind(PropertyTreeMetaObject target,
                                                    PropertyTreeNavigator navigator,
                                                    IServiceProvider serviceProvider)
        {
            if (target == null)
            {
                throw new ArgumentNullException("target");
            }
            if (navigator == null)
            {
                throw new ArgumentNullException("navigator");
            }

            if (navigator.IsProperty)
            {
                var textValue = navigator.Value as string;
                if (textValue != null)
                {
                    return(BindInitializeValue(
                               target,
                               navigator,
                               serviceProvider,
                               () => target.BindInitializeValue(textValue, serviceProvider)));
                }

                var exprValue = navigator.Value as Expression;
                if (exprValue != null)
                {
                    var exprContext = ExpressionContext.Compose(
                        CurrentExpressionContext,
                        ExpressionContext.FromNameScope(FindNameScope(target))
                        );
                    exprValue = ExpressionUtility.LiftToCall(exprValue, exprContext);
                    return(BindInitializeValue(
                               target,
                               navigator,
                               serviceProvider,
                               () => target.BindInitializer(exprValue, exprContext, serviceProvider)));
                }

                throw new NotImplementedException();
            }

            var children = SelectChildren(navigator);

            return(BindChildNodes(target, navigator, NodeList.Create(children)));
        }