/// <summary>
 /// Creates a new derivative operation from a numeric or derivative module and an operator.
 /// The operator will be used with the module's number value, instead of a built-in value.
 /// </summary>
 /// <param name="reference">The module.</param>
 /// <param name="oper">The operator.</param>
 public DerivativeOperation(ModuleNumeric reference, char oper)
 {
     if (reference.ModuleType != ModuleData.moduleType.NUMERIC && reference.ModuleType != ModuleData.moduleType.DERIVATIVE)
     {
         throw new ArgumentException("This subclass of ModuleNumeric can't be made into a derivative operation this way. It only works with NUMERIC and DERIVATIVE.");
     }
     this.reference = reference;
     logic          = oper + "";
 }
            /// <summary>
            /// Does this DerivativeOperation's calculation on a number.
            /// </summary>
            /// <param name="source">The original number.</param>
            /// <returns>The number after calculation.</returns>
            public double Calc(double source)
            {
                double val = source;

                if (reference == null)
                {
                    char   oper = logic[0];
                    double mod  = double.Parse(logic.Substring(1));
                    val = Operate(oper, source, mod);
                }
                else if (reference is ModuleCheck)
                {
                    ModuleCheck check  = reference as ModuleCheck;
                    string[]    logics = logic.Split(',');
                    if (check.IsChecked)
                    {
                        char   oper = logics[0][0];
                        double mod  = double.Parse(logics[0].Substring(1));
                        val = Operate(oper, source, mod);
                    }
                    else if (logics.Length > 1)
                    {
                        char   oper = logics[1][0];
                        double mod  = double.Parse(logics[1].Substring(1));
                        val = Operate(oper, source, mod);
                    }
                }
                else if (reference is ModuleMenu)
                {
                    ModuleMenu menu   = reference as ModuleMenu;
                    string[]   logics = logic.Split(',');
                    char       oper   = logics[menu.MenuIndex - 1][0];
                    double     mod    = double.Parse(logics[menu.MenuIndex - 1].Substring(1));
                    val = Operate(oper, source, mod);
                }
                else if (reference is ModuleNumeric)
                {
                    ModuleNumeric numeric = reference as ModuleNumeric;
                    char          oper    = logic[0];
                    double        mod     = numeric.Number;
                    val = Operate(oper, source, mod);
                }
                else
                {
                    throw new ArgumentException("Cannot calculate a DerivativeOperation based on a " + reference.ModuleType + " module.");
                }

                return(val);
            }