protected virtual void GetVirtualSolutionFolderTemplateObjects(ITemplateObject root,
                                                                       IList <VirtualSolutionFolder> virtualSolutionFolders, string parentPath)
        {
            foreach (var virtualSolutionFolder in virtualSolutionFolders)
            {
                var virtualFolderObject = new TemplateObject
                {
                    Type = TemplateObjectType.Folder,
                    DestinationFullPath = Path.Combine(parentPath, virtualSolutionFolder.Name)
                };

                foreach (var filePath in virtualSolutionFolder.Files)
                {
                    virtualFolderObject.ChildObjects.Add(new TemplateObject
                    {
                        ChildObjects        = null,
                        Type                = TemplateObjectType.File,
                        OriginalFullPath    = filePath,
                        DestinationFullPath = ReplaceTokensService.Replace(BuildDestinationPathService.Build(filePath))
                    });
                }

                if (virtualSolutionFolder.SubFolders == null || !virtualSolutionFolders.Any())
                {
                    continue;
                }
                GetVirtualSolutionFolderTemplateObjects(virtualFolderObject, virtualSolutionFolder.SubFolders,
                                                        virtualFolderObject.DestinationFullPath);
                root.ChildObjects.Add(virtualFolderObject);
            }
        }
        protected virtual ITemplateObject GetTemplateObjectFromFile(string filePath)
        {
            var isIgnored = IsIgnored(filePath);

            return(new TemplateObject
            {
                Type = IsProjectToAttach(filePath) ? TemplateObjectType.Project : TemplateObjectType.File,
                ChildObjects = null,
                OriginalFullPath = filePath,
                IsIgnored = isIgnored,
                DestinationFullPath = isIgnored ? "" : ReplaceTokensService.Replace(BuildDestinationPathService.Build(filePath))
            });
        }
        protected virtual IList <ITemplateObject> GetTemplateObjectFromDirectory(string directoryPath)
        {
            var templateObjects = Directory.EnumerateFiles(directoryPath).Select(GetTemplateObjectFromFile)
                                  .Where(objectFromFile => objectFromFile != null).ToList();

            templateObjects.AddRange(Directory.EnumerateDirectories(directoryPath)
                                     .Select(directory => new TemplateObject
            {
                Type                = IsSourceRoot(directory) ? TemplateObjectType.SourceRoot : TemplateObjectType.Folder,
                ChildObjects        = GetTemplateObjectFromDirectory(directory),
                OriginalFullPath    = directory,
                DestinationFullPath = ReplaceTokensService.Replace(BuildDestinationPathService.Build(directory))
            }));
            return(templateObjects);
        }