public override void RegisterPorts(FlowNode node, MethodInfo method, ReflectedMethodRegistrationOptions options)
        {
            call = method.RTCreateDelegate <ActionCall>(null);
            var o = node.AddFlowOutput(" ");

            node.AddFlowInput(" ", (f) => { Call(); o.Call(f); });
        }
 public override void RegisterPorts(FlowNode node, MethodInfo method, ReflectedMethodRegistrationOptions options)
 {
     call = method.RTCreateDelegate <FunctionCall <TResult> >(null);
     if (options.callable)
     {
         var o = node.AddFlowOutput(" ");
         node.AddFlowInput(" ", (f) => { Call(); o.Call(f); });
     }
     node.AddValueOutput <TResult>("Value", () => { return(options.callable ? returnValue : Call()); });
 }
        public override void RegisterPorts(FlowNode node, MethodInfo method, ReflectedMethodRegistrationOptions options)
        {
            this.method = method;
            var parameters = method.GetParameters();

            //Flow ports
            if (options.callable)
            {
                var o = node.AddFlowOutput(" ");
                node.AddFlowInput(" ", (f) => { CallMethod(); o.Call(f); });
            }

            //Instance ports
            if (!method.IsStatic)
            {
                instanceInput = node.AddValueInput(method.DeclaringType.FriendlyName(), method.DeclaringType);
                if (options.callable)
                {
                    node.AddValueOutput(method.DeclaringType.FriendlyName(), method.DeclaringType, () => { return(instance); });
                }
            }

            //Return value port
            if (method.ReturnType != typeof(void))
            {
                node.AddValueOutput("Value", method.ReturnType, () => { return(options.callable ? returnValue : CallMethod()); });
            }

            //Parameter ports
            inputs = new List <ValueInput>();
            for (var _i = 0; _i < parameters.Length; _i++)
            {
                var i         = _i;
                var parameter = parameters[i];
                var paramName = parameter.Name;
                if (instanceInput != null && paramName == instanceInput.name)     //for rare cases where it's same as instance name like for example in Animation class.
                {
                    paramName = paramName + " ";
                }

                if (parameter.IsOut || parameter.ParameterType.IsByRef)
                {
                    node.AddValueOutput(paramName, parameter.ParameterType.GetElementType(), () => { if (!options.callable)
                                                                                                     {
                                                                                                         CallMethod();
                                                                                                     }
                                                                                                     return(args[i]); });
                    inputs.Add(new ValueInput <object>(null, null, null)); //add dummy inputs for the shake of getting out args correctly by index
                }
                else
                {
                    if (options.exposeParams && parameter.IsParams(parameters))
                    {
                        paramsInputs    = new List <ValueInput>();
                        paramsArrayType = parameter.ParameterType;
                        for (var j = 0; j < options.exposedParamsCount; j++)
                        {
                            var paramPort = node.AddValueInput(paramName + " #" + j, parameter.ParameterType.GetEnumerableElementType(), paramName + j);
                            paramsInputs.Add(paramPort);
                        }
                    }
                    else
                    {
                        var paramPort = node.AddValueInput(paramName, parameter.ParameterType);
                        if (parameter.IsOptional)
                        {
                            if (paramPort != null)
                            {
                                paramPort.serializedValue = parameter.DefaultValue;
                            }
                        }
                        inputs.Add(paramPort);
                    }
                }
            }
        }
 ///Derived type must implement way of registration.
 abstract public void RegisterPorts(FlowNode node, MethodInfo method, ReflectedMethodRegistrationOptions options);