/// <summary>
		/// Obtém o valor para uma BindableTextKey.
		/// </summary>
		/// <param name="key">A BindableTextKey.</param>
		/// <returns>O valor da BindableTextKey.</returns>
		private object GetBindableKeyValue(BindableTextKey key)
		{
			// Verifica se ainda não existe no cache.
			if (!m_bindableKeyValuesCache.ContainsKey(key.Name))
			{
				// Obtém o objeto bindable.
				object bindableObject = GetBindable(key);
				object value = null;

				// Se for um bind sem propriedade. Ex.: {User}.
				if (String.IsNullOrEmpty(key.PropertyName))
				{
					value = bindableObject; // Utiliza o próprio objeto como valor.
				}
				else // Se for um bind com propriedade. Ex.: {User.FullName}.
				{
					try
					{
						// Obtém o valor da propriedade.
						value = GetPropertyValue(bindableObject, key.PropertyName);
					}
					catch (InvalidOperationException ex)
					{
						// A propriedade não foi localizada no objeto.
						throw new InvalidOperationException(
							String.Format("The property '{0}' was not found on object '{1}'.", key.PropertyName, key.ObjectName),
							ex);
					}
				}

				// Armazena no cache.
				m_bindableKeyValuesCache[key.Name] = value;
			}

			return m_bindableKeyValuesCache[key.Name];
		}
		private bool ProcessConditionalKeys(BindableTextKey key)
		{
			// if and endif
			if (key.Name.Equals("#endif", StringComparison.OrdinalIgnoreCase))
			{
				var topInStack = m_ifStack.Pop();
				
				if (topInStack.Value)
				{
					m_text.Replace(key.NameWithPrefixAndSuffix, "");
				}
				else
				{
					var newText = StringHelper.ReplaceBetween(m_text.ToString(), "", topInStack.Key, key.NameWithPrefixAndSuffix, false);
					m_text.Remove(0, m_text.Length);
					m_text.Append(newText);
				}
				
				
				return true;
			}
			else if (m_ifStack.Count > 0 && !m_ifStack.Peek().Value)
			{
				return true;
			}
			else if (key.Name.StartsWith("#if "))
			{
				var ifValue = (bool)GetBindableKeyValue(key);
				
				if (ifValue)
				{
					m_text.Replace(key.NameWithPrefixAndSuffix, "");
				}
				
				m_ifStack.Push(new KeyValuePair<string, bool>(key.NameWithPrefixAndSuffix, ifValue));
				return !ifValue;
			}
			
			return false;
		}
		/// <summary>
		/// Obtém um objeto bindable pela chave de binding.
		/// </summary>
		/// <param name="key">A BindableTextKey.</param>
		/// <returns>O objeto bindable localizado.</returns>
		private object GetBindable(BindableTextKey key)
		{
			if (m_bindables.ContainsKey(key.ObjectName))
			{
				return m_bindables[key.ObjectName];
			}
			else
			{
				// O objeto não foi localizado
				throw new InvalidOperationException(String.Format("Object '{0}' not found", key.ObjectName));
			}
		}