/// <summary>
        /// Walks a method call. Typical method calls are:
        ///
        /// @menuItem1.Items.AddRange(...)
        ///
        /// This method will execute the method call.
        /// </summary>
        void WalkMethodCall(MethodCall node)
        {
            // Try to get the object being called. Try the form first then
            // look for other controls.
            object member = RubyControlFieldExpression.GetMember(component, node);
            RubyControlFieldExpression field = RubyControlFieldExpression.Create(node);

            if (member == null)
            {
                member = field.GetMember(componentCreator);
            }

            // Execute the method on the object.
            if (member != null)
            {
                if (node.Arguments == null)
                {
                    RegisterEventHandler(node, member);
                }
                else
                {
                    object[] args = deserializer.GetArguments(node).ToArray();
                    InvokeMethod(member, field.MethodName, args);
                }
            }
        }
        object CreateInstance(string name, MethodCall methodCall)
        {
            RubyControlFieldExpression field = RubyControlFieldExpression.Create(methodCall);
            Type type = GetType(field);

            if (type != null)
            {
                if (type.IsEnum)
                {
                    return(Enum.Parse(type, methodCall.MethodName));
                }

                BindingFlags propertyBindingFlags = BindingFlags.Public | BindingFlags.GetField | BindingFlags.Static | BindingFlags.Instance;
                PropertyInfo propertyInfo         = type.GetProperty(methodCall.MethodName, propertyBindingFlags);
                if (propertyInfo != null)
                {
                    return(propertyInfo.GetValue(type, null));
                }

                if (type.IsAssignableFrom(typeof(ComponentResourceManager)))
                {
                    return(componentCreator.CreateInstance(type, new object[0], name, false));
                }

                if (methodCall.Arguments != null)
                {
                    return(CreateInstance(type, name, methodCall));
                }
            }
            else
            {
                return(componentCreator.GetInstance(field.MethodName));
            }
            return(null);
        }
        void WalkSimpleAssignment(SimpleAssignmentExpression node)
        {
            AttributeAccess  attributeAccess = node.Left as AttributeAccess;
            InstanceVariable instance        = node.Left as InstanceVariable;
            LocalVariable    localVariable   = node.Left as LocalVariable;

            if (attributeAccess != null)
            {
                RubyControlFieldExpression field = RubyControlFieldExpression.Create(attributeAccess);
                object propertyValue             = deserializer.Deserialize(node.Right);
                if (propertyValue != null)
                {
                    field.SetPropertyValue(componentCreator, propertyValue);
                }
                else if (IsResource(node.Right))
                {
                    field.SetPropertyValue(componentCreator, GetResource(node.Right as MethodCall));
                }
                else
                {
                    ThrowCouldNotFindTypeException(node.Right);
                }
            }
            else if (instance != null)
            {
                string instanceName  = RubyControlFieldExpression.GetVariableName(instance.Name);
                object propertyValue = deserializer.Deserialize(instanceName, node.Right);
                AddComponent(instanceName, propertyValue);
            }
            else if (localVariable != null)
            {
                object propertyValue = deserializer.Deserialize(localVariable.Name, node.Right);
                if (propertyValue == null)
                {
                    ThrowCouldNotFindTypeException(node.Right);
                }
            }
        }