//static Object GetNestedContextIfAny( Object context, String path )
		//{
		//	var segements = path.Split( new[] { '.' }, StringSplitOptions.RemoveEmptyEntries );
		//	if ( context != null && segements.Length > 1 )
		//	{

		//	}

		//	return context;
		//}

		/// <summary>
		/// Tries to generate command data.
		/// </summary>
		/// <param name="path">The path.</param>
		/// <param name="dataContext">The data context.</param>
		/// <param name="data">The data.</param>
		/// <returns></returns>
		public virtual Boolean TryGenerateCommandData( PropertyPath path, Object dataContext, out CommandData data )
		{
			var propertyPath = path.Path;
			var nestedProperties = propertyPath
				.Split(new[] { '.' }, StringSplitOptions.RemoveEmptyEntries);
			var propertyLevel = 0;
			while (dataContext != null && propertyLevel < nestedProperties.Length-1)
			{
				var currentProperty = nestedProperties[propertyLevel];
				var dataContextType = dataContext.GetType();
				var pi = dataContextType.GetProperty(currentProperty);
				if (pi == null)
				{
					logger.Error("Cannot find any property named: {0}.", currentProperty);
					dataContext = null;
					break;
				}
				dataContext = pi.GetValue(dataContext, null);
				propertyLevel++;
				propertyPath = nestedProperties[propertyLevel];
			}

			if ( dataContext == null )
			{
				data = null;
				return false;
			}

			var methodName = GetExpectedMethodName( propertyPath );
			var factName = String.Concat( "Can", methodName );
			var properties = dataContext.GetType().GetProperties();

			var commandData = dataContext.GetType()
				.GetMethods()
				.Where( mi => mi.Name.Equals( methodName ) )
				.Select( mi =>
				{
					var prms = mi.GetParameters();

					return new CommandData()
					{
						DataContext = dataContext,
						FastDelegate = mi.CreateVoidDelegate(),

						Fact = properties.Where( pi =>
						{
							return pi.PropertyType == typeof( Fact ) && pi.Name.Equals( factName );
						} )
						.Select( pi =>
						{
							var fact = ( Fact )pi.GetValue( dataContext, null );
							return fact;
						} )
						.SingleOrDefault(),

						BooleanFact = properties.Where( pi =>
						{
							return dataContext is INotifyPropertyChanged
								&& pi.PropertyType == typeof( Boolean )
								&& pi.Name.Equals( factName );
						} )
						.Select( pi => new BooleanFact
						{
							FastGetter = dataContext.CreateFastPropertyGetter<Boolean>( pi ),
							Name = pi.Name
						} )
						.SingleOrDefault(),

						HasParameter = prms.Length == 1,
						ParameterType = prms.Length != 1 ? null : prms[ 0 ].ParameterType,
						KeyBindings = mi.GetAttributes<KeyBindingAttribute>(),
						Description = mi.GetAttribute<CommandDescriptionAttribute>()
					};
				} )
				.SingleOrDefault();

			if ( commandData == null )
			{
				logger.Warning( "Cannot find any method named: {0}.", methodName );
			}

			data = commandData;

			return commandData != null;
		}