protected void Argument(
            NameString name,
            Action <IArgumentDescriptor> argument)
        {
            if (argument == null)
            {
                throw new ArgumentNullException(nameof(argument));
            }

            var descriptor = new ArgumentDescriptor(
                Context,
                name.EnsureNotEmpty(nameof(name)));

            argument(descriptor);
            Definition.Arguments.Add(descriptor.CreateDefinition());
        }
        protected void Argument(
            NameString name,
            Action <IArgumentDescriptor> argument)
        {
            if (argument == null)
            {
                throw new ArgumentNullException(nameof(argument));
            }

            name.EnsureNotEmpty(nameof(name));

            ArgumentDescriptor descriptor =
                Parameters != null &&
                Parameters.TryGetValue(name, out ParameterInfo p)
                    ? ArgumentDescriptor.New(Context, p)
                    : ArgumentDescriptor.New(Context, name);

            argument(descriptor);

            ArgumentDefinition definition = descriptor.CreateDefinition();

            Definition.Arguments.Add(definition);
        }