public object ExecScript(object targetObject, string script)
        {
            object returnValue = null;
            int    lineIndex   = 0;

            this.targetObject = targetObject;

            var        lines          = script.Split(new string[] { "\r\n" }, StringSplitOptions.None);
            ScriptLine lastScriptLine = null;

            while (lineIndex < lines.Count())
            {
                var scriptLine = new ScriptLine(lineIndex, lines[lineIndex]);
                if (lastScriptLine != null)
                {
                    if (scriptLine.Level == lastScriptLine.Level + 1)
                    {
                        scriptLine.ParentIndex = lastScriptLine.LineIndex;
                    }
                    else if (scriptLine.Level == lastScriptLine.Level)
                    {
                        scriptLine.ParentIndex = lastScriptLine.ParentIndex;
                    }
                    else if (scriptLine.Level == lastScriptLine.Level - 1)
                    {
                        var parentLine =
                            scriptLines
                            .Where(l => l.Level == scriptLine.Level - 1)
                            .OrderBy(l => l.LineIndex)
                            .LastOrDefault();

                        if (parentLine != null)
                        {
                            scriptLine.ParentIndex = parentLine.LineIndex;
                        }
                    }
                }
                scriptLines.Add(scriptLine);
                lastScriptLine = scriptLine;
                lineIndex++;
            }

            returnValue = ExecScriptInternal(targetObject, -1);
            return(returnValue);
        }
        private bool ProcessIfBlock(object targetObject, ScriptLine scriptLine, string ifExpression)
        {
            var result = false;

            if (!scriptLines.Where(sl => sl.ParentIndex == scriptLine.LineIndex).Any())
            {
                throw new IfWithoutBlockException();
            }

            if (string.IsNullOrEmpty(ifExpression))
            {
                result = true;
            }
            else
            {
                result = (bool)lineProcessor.ExecLine(targetObject, ifExpression);
            }

            if (result)
            {
                ExecScriptInternal(targetObject, scriptLine.LineIndex);
            }
            return(result);
        }