public override void Transform(Engine engine, Package package)
        {
            GeneralUtils.TimedLog("start Transform");
            Package = package;
            Engine  = engine;
            XmlSerializer serializer;

            Dynamic.Page page;
            bool         hasOutput = HasPackageValue(package, "Output");

            if (hasOutput)
            {
                GeneralUtils.TimedLog("start retrieving previous Output from package");
                String inputValue = package.GetValue("Output");
                GeneralUtils.TimedLog("start creating serializer");
                serializer = new PageSerializer();
                GeneralUtils.TimedLog("finished creating serializer");
                TextReader tr = new StringReader(inputValue);
                GeneralUtils.TimedLog("start deserializing from package");
                page = (Dynamic.Page)serializer.Deserialize(tr);
                GeneralUtils.TimedLog("finished deserializing from package");
            }
            else
            {
                GeneralUtils.ResetLogTimer();
                GeneralUtils.TimedLog("Could not find 'Output' in the package");
                GeneralUtils.TimedLog("Start creating dynamic page from current page in the package");
                page = GetDynamicPage(Manager);
                GeneralUtils.TimedLog("Finished creating dynamic page with title " + page.Title);
                GeneralUtils.TimedLog("start creating serializer");
                serializer = new PageSerializer();
                GeneralUtils.TimedLog("finished creating serializer");
            }

            try
            {
                GeneralUtils.TimedLog("starting transformPage");
                TransformPage(page);
                GeneralUtils.TimedLog("finished transformPage");
            }
            catch (StopChainException)
            {
                GeneralUtils.TimedLog("caught stopchainexception, will not write current page back to the package");
                return;
            }
            StringWriter sw     = new StringWriter();
            MemoryStream ms     = new MemoryStream();
            XmlWriter    writer = new XmlTextWriterFormattedNoDeclaration(ms, Encoding.UTF8);
            string       outputValue;
            //Create our own namespaces for the output
            XmlSerializerNamespaces ns = new XmlSerializerNamespaces();

            //Add an empty namespace and empty value
            ns.Add("", "");

            serializer.Serialize(writer, page, ns);
            outputValue = Encoding.UTF8.GetString(ms.ToArray());

            // for some reason, the .NET serializer leaves an invalid character at the start of the string
            // we will remove everything up to the first < so that the XML can be deserialized later!
            Regex re = new Regex("^[^<]+");

            outputValue = re.Replace(outputValue, "");

            if (hasOutput)
            {
                Item outputItem = package.GetByName("Output");
                package.Remove(outputItem);
                package.PushItem(Package.OutputName, package.CreateStringItem(ContentType.Xml, outputValue));
            }
            else
            {
                package.PushItem(Package.OutputName, package.CreateStringItem(ContentType.Xml, outputValue));
            }

            GeneralUtils.TimedLog("finished Transform");
        }
        public override void Transform(Engine engine, Package package)
        {
            GeneralUtils.TimedLog("start Transform");
            Package = package;
            Engine = engine;
            XmlSerializer serializer;

            Dynamic.Page page;
            bool hasOutput = HasPackageValue(package, "Output");
            if (hasOutput)
            {
                GeneralUtils.TimedLog("start retrieving previous Output from package");
                String inputValue = package.GetValue("Output");
                GeneralUtils.TimedLog("start creating serializer");
                serializer = new PageSerializer();
                GeneralUtils.TimedLog("finished creating serializer");
                TextReader tr = new StringReader(inputValue);
                GeneralUtils.TimedLog("start deserializing from package");
                page = (Dynamic.Page)serializer.Deserialize(tr);
                GeneralUtils.TimedLog("finished deserializing from package");
            }
            else
            {
                GeneralUtils.ResetLogTimer();
                GeneralUtils.TimedLog("Could not find 'Output' in the package");
                GeneralUtils.TimedLog("Start creating dynamic page from current page in the package");
                page = GetDynamicPage(Manager);
                GeneralUtils.TimedLog("Finished creating dynamic page with title " + page.Title);
                GeneralUtils.TimedLog("start creating serializer");
                serializer = new PageSerializer();
                GeneralUtils.TimedLog("finished creating serializer");
            }

            try
            {
                GeneralUtils.TimedLog("starting transformPage");
                TransformPage(page);
                GeneralUtils.TimedLog("finished transformPage");
            }
            catch (StopChainException)
            {
                GeneralUtils.TimedLog("caught stopchainexception, will not write current page back to the package");
                return;
            }
            StringWriter sw = new StringWriter();
            MemoryStream ms = new MemoryStream();
            XmlWriter writer = new XmlTextWriterFormattedNoDeclaration(ms, Encoding.UTF8);
            string outputValue;
            //Create our own namespaces for the output
            XmlSerializerNamespaces ns = new XmlSerializerNamespaces();

            //Add an empty namespace and empty value
            ns.Add("", "");

            serializer.Serialize(writer, page, ns);
            outputValue = Encoding.UTF8.GetString(ms.ToArray());

            // for some reason, the .NET serializer leaves an invalid character at the start of the string
            // we will remove everything up to the first < so that the XML can be deserialized later!
            Regex re = new Regex("^[^<]+");
            outputValue = re.Replace(outputValue, "");

            if (hasOutput)
            {
                Item outputItem = package.GetByName("Output");
                package.Remove(outputItem);
                package.PushItem(Package.OutputName, package.CreateStringItem(ContentType.Xml, outputValue));
            }
            else
            {
                package.PushItem(Package.OutputName, package.CreateStringItem(ContentType.Xml, outputValue));
            }

            GeneralUtils.TimedLog("finished Transform");

        }