void CreateFilterFunction(Expression expr, CodeTypeDeclaration codeType)
    {
        if (expr.Operands.Length != 1)
        {
            //Something is wrong
            Debug.LogFormat("Wrong amount of operands in scope function in {0}", codeType.Name);
            return;
        }
        Scope scope = (expr.Operands [0] as ExprAtom).Content as Scope;

        if (scope == null)
        {
            Debug.LogFormat("Scope function doesn't contain scope function in {0}", codeType.Name);
            return;
        }
        CodeMemberMethod method = new CodeMemberMethod();

        method.ReturnType = new CodeTypeReference(typeof(bool));
        method.Parameters.Add(new CodeParameterDeclarationExpression(typeof(GameObject), "go"));

        method.Name       = "Filter";
        method.Attributes = MemberAttributes.Override | MemberAttributes.Public;
        for (int i = 0; i < scope.Parts.Count; i++)
        {
            var part = scope.Parts [i];
            if (part is FunctionCall)
            {
                var call   = part as FunctionCall;
                var filter = filters.GetFilter(call.Name);
                filter.Interpret(call.Args, method);
            }
            else
            {
                var filter = filters.GetFilter(part as string);
                filter.Interpret(null, method);
            }
        }
        method.Statements.Add(new CodeSnippetStatement("return true;"));
        codeType.Members.Add(method);
    }