void EnsureWorkflow()
        {
            var context = buildContext;

            while (context != null)
            {
                var includeContext = context as IncludeContext;
                if (includeContext != null && includeContext.Path == path)
                {
                    var message = string.Format("Included workflow '{0}' includes itself.", path);
                    throw new InvalidOperationException(message);
                }

                context = context.ParentContext;
            }

            if (string.IsNullOrEmpty(path))
            {
                workflow    = null;
                description = null;
                SetArgumentRange(0, 1);
            }
            else
            {
                var embeddedResource = IsEmbeddedResourcePath(path);
                var lastWriteTime    = embeddedResource ? DateTime.MaxValue : File.GetLastWriteTime(path);
                if (workflow == null || lastWriteTime > writeTime)
                {
                    var properties = workflow != null?GetXmlProperties() : xmlProperties;

                    using (var stream = GetWorkflowStream(path, embeddedResource))
                        using (var reader = XmlReader.Create(stream))
                        {
                            reader.MoveToContent();
                            var serializer = new XmlSerializer(typeof(WorkflowBuilder), reader.NamespaceURI);
                            var builder    = (WorkflowBuilder)serializer.Deserialize(reader);
                            description = builder.Description;
                            workflow    = builder.Workflow;
                            writeTime   = lastWriteTime;
                        }

                    var parameterCount = workflow.GetNestedParameters().Count();
                    SetArgumentRange(0, parameterCount);
                    if (inspectWorkflow)
                    {
                        workflow = workflow.ToInspectableGraph();
                    }

                    if (properties != null)
                    {
                        SetXmlProperties(properties);
                    }
                }
            }
        }
        internal IncludeWorkflowBuilder(IncludeWorkflowBuilder builder, bool inspect)
            : base(builder.ArgumentRange.LowerBound, builder.ArgumentRange.UpperBound)
        {
            inspectWorkflow = inspect;
            workflow        = builder.workflow;
            if (workflow != null && inspect != builder.inspectWorkflow)
            {
                workflow = inspect ? workflow.ToInspectableGraph() : workflow.FromInspectableGraph();
            }

            writeTime     = builder.writeTime;
            name          = builder.name;
            path          = builder.path;
            description   = builder.description;
            xmlProperties = builder.xmlProperties;
        }