private object TraverseMember(object target, MemberTraversal member, bool isLastPathSegment)
        {
            if (target == null)
            {
                return(null);
            }

            object result = null;

            // Is Target a Collection?
            // Extract first item
            target.TryAs <IEnumerable>(collection =>
            {
                var list      = Enumerable.Cast <object>(collection);
                var newTarget = list.FirstOrDefault();
                result        = TraverseMember(newTarget, member, isLastPathSegment);
            });


            if (result == null)
            {
                // Target is a single object

                if (string.IsNullOrEmpty(member.MemberName))
                {
                    // Self
                    result = target;
                }
                else
                {
                    // Get Related Member
                    result = ReflectionHelper.GetMemberValue(target, member.MemberName);
                }

                // Is it a Collection?
                result.TryAs <IEnumerable>(collection =>
                {
                    // If not last path segment
                    // or supposed to extract item
                    bool shouldExtractItem = !isLastPathSegment || member is ExtractFromCollectionTraversal;

                    if (shouldExtractItem)
                    {
                        result = ExtractItemFromCollection(collection.Cast <object>().ToList(), member);
                    }
                });
            }

            return(result);
        }
        private object ExtractItemFromCollection(List <object> collection, MemberTraversal member)
        {
            object result = null;

            if (collection == null || collection.Count == 0)
            {
                return(null);
            }

            // By default, Extract first item
            result = collection.First();

            // or, Extract specific item from collection
            member.TryAs <ExtractFromCollectionTraversal>(extractTraversal =>
            {
                result = collection[extractTraversal.IndexToExtract];
            });

            return(result);
        }