private static Expression GetMemberInvocaton(Base v, Scope scope, MemberBinder binder, SimpleBinder simple)
        {
            var value = v as Value;

            Expression memberObject;
            if (value != null && value.Properties.Count > 0)
            {
                var last = value.Properties.Last() as Access;
                Helper.IsNotNull(last);
                var nameLit = last.Name as Literal;
                Helper.IsNotNull(nameLit);

                value.Properties.Remove(last);

                memberObject = Compile(value, scope);

                return binder(memberObject, nameLit.Value);
            }

            memberObject = Compile(v, scope);

            return simple(memberObject);
        }
    public static void Go()
    {
        Object       o      = new SomeType();
        Type         t      = typeof(SomeType);
        SimpleBinder binder = new SimpleBinder();
        BindingFlags bf     = BindingFlags.Public | BindingFlags.Instance;

        Int16 b = 5;

        // Calls Void v(Int32)
        t.InvokeMember("v", bf | BindingFlags.InvokeMethod, binder, o, new Object[] { b });

        // Calls Void m(Int32)
        t.InvokeMember("m", bf | BindingFlags.InvokeMethod, binder, o, new Object[] { 1 });

        // Calls Void m(System.Object)
        t.InvokeMember("m", bf | BindingFlags.InvokeMethod, binder, o, new Object[] { new Object() });

        // Calls Void m(Double)
        t.InvokeMember("m", bf | BindingFlags.InvokeMethod, binder, o, new Object[] { 1.4 });

        // Calls Void m(SomeType)
        t.InvokeMember("m", bf | BindingFlags.InvokeMethod, binder, o, new Object[] { o });

        // Calls Void m(System.Object) since m(String) is private
        t.InvokeMember("m", bf | BindingFlags.InvokeMethod, binder, o, new Object[] { "string" });

        // Calls Void m(System.String) since NonPublic is specified
        t.InvokeMember("m", bf | BindingFlags.NonPublic | BindingFlags.InvokeMethod, binder, o, new Object[] { "string" });

        try {
            // Throws because there is no public method which takes exactly a string
            t.InvokeMember("m", bf | BindingFlags.InvokeMethod | BindingFlags.ExactBinding, binder, o, new Object[] { "string" });
        }
        catch (MissingMethodException) {
            Console.WriteLine("Invocation failed on m(String), bad binding flags - ExactBinding too restrictive");
        }

        try {
            // Throws because there is no method g which takes only 2 args
            t.InvokeMember("g", bf | BindingFlags.InvokeMethod, binder, o, new Object[] { 1, "string" });
        }
        catch (MissingMethodException) {
            Console.WriteLine("Invocation failed on g(int, Object, String), wrong number of args");
        }

        // Calls Void g(Int32, System.Object, System.String)
        t.InvokeMember("g", bf | BindingFlags.InvokeMethod, binder, o, new Object[] { 1, "string", "string" });

        // Calls Void h()
        t.InvokeMember("h", bf | BindingFlags.NonPublic | BindingFlags.InvokeMethod, binder, o, new Object[] { });

        try {
            // Throws because BindingFlags.Static has not been specified
            t.InvokeMember("s", bf | BindingFlags.InvokeMethod, binder, o, new Object[] { });
        }
        catch (MissingMethodException) {
            Console.WriteLine("Invocation failed on static s(), bad binding flags - need Static");
        }

        // Calls Void s()
        t.InvokeMember("s", bf | BindingFlags.InvokeMethod | BindingFlags.Static, binder, o, new Object[] { });

        // Calls Void m(Int32, Double)
        t.InvokeMember("m", bf | BindingFlags.InvokeMethod, binder, o, new Object[] { 1, 1 });

        Console.WriteLine("Press <Enter> to exit.");
        Console.ReadLine();
    }