private static MvxChainedSourceBinding CreateChainedBinding(object source, MvxBasePropertyToken propertyToken,
                                                                    List<MvxBasePropertyToken> remainingTokens)
        {
            if (propertyToken is MvxIndexerPropertyToken)
            {
                return new MvxIndexerChainedSourceBinding(source, (MvxIndexerPropertyToken) propertyToken,
                                                          remainingTokens);
            }
            else if (propertyToken is MvxPropertyNamePropertyToken)
            {
                return new MvxSimpleChainedSourceBinding(source, (MvxPropertyNamePropertyToken) propertyToken,
                                                         remainingTokens);
            }

            throw new MvxException("Unexpected property chaining - seen token type {0}",
                                   propertyToken.GetType().FullName);
        }
        private static IMvxSourceBinding CreateLeafBinding(object source, MvxBasePropertyToken propertyToken)
        {
            if (propertyToken is MvxIndexerPropertyToken)
            {
                return new MvxIndexerLeafPropertyInfoSourceBinding(source, (MvxIndexerPropertyToken) propertyToken);
            }
            else if (propertyToken is MvxPropertyNamePropertyToken)
            {
                return new MvxSimpleLeafPropertyInfoSourceBinding(source, (MvxPropertyNamePropertyToken) propertyToken);
            }
            else if (propertyToken is MvxEmptyPropertyToken)
            {
                return new MvxDirectToSourceBinding(source);
            }

            throw new MvxException("Unexpected property source - seen token type {0}", propertyToken.GetType().FullName);
        }