public override Composite Convert(Bundle.EntryComponent entry, int resourceIndex)
        {
            // create the resource root using the type of the resource and iteration of the resource
            var resourceRoot = new Composite(MappedTermsDictionary[entry.Resource.TypeName] + $":{resourceIndex}");

            resourceRoot = Helpers.ReflectionHelper.GetObjectComposite(entry.Resource, resourceRoot, MappedTermsDictionary, SkipNodeNames);

            // prune nodes
            var matchingNodes = resourceRoot.All(new List <Component>()).Where(x => x.GetType() == typeof(Leaf) && NodePruneList.Any(t => x.PathToRoot.Contains(t))).ToList();

            foreach (var node in matchingNodes)
            {
                // get the parent node of the node at the start of the path
                var currentNode = node.Parent;

                // calculate how many nodes we need to traverse backwards
                var iterationCount = NodePruneList.OrderByDescending(x => x.Length)
                                     .First(t => node.PathToRoot.Contains(t))?.Split('/').Length;

                // traverse nodes to get to the sub root, removing the old ones as we go
                for (var i = 0; i < iterationCount; i++)
                {
                    var oldNode = currentNode;
                    currentNode = currentNode.Parent;
                    currentNode.Remove(oldNode);
                }

                // add the leaf from the end of the path to the start of the path
                resourceRoot.FindById(currentNode.Id).Add(new Leaf(node.Name));
            }

            // done, return resource root
            return(resourceRoot);
        }