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;
        }