## WeBWorK Problems

by Davide Cervone -
Number of replies: 0
The Value package (part of MathObjects) has a function for telling you whether a variable is a reference to a MathObject or not:
    Value::isValue($f)  will return true if $f is a MathObject and false otherwise. There is also one for telling is something is a Formula object (as opposed to other MathObjects:
   Value::isFormula($f)  So you could use something like  sub mySubroutine { my$f = shift; if (Value::isFormula($f)) {$f = $f->perlFunction} ... }  to convert a MathObject Formula into a subroutine reference. That way you could pass either a MathObject or a CODE reference to mySubroutine and $f would always end up being a CODE reference. You could even do
    sub mySubroutine {
my $f = shift; if (ref($f) ne "CODE") {
$f = Value->Package("Formula")->new($f)->perlFunction;
}
...
}

so that if $f is passed as a string or as a Formula or as some constant, it will be turned into a formula and converted to a CODE reference. This approach does not require that MathObjects.pl be loaded (which using main::Formula() in place of Value->Package("Formula")->new() would). The problem with using ref($f) and looking for Value::Formula is that there are a number of MathObjects that make subclasses of Value::Formula, so unless you check for those as well, you might not handle all the formulas that people would pass to you. And since new subclasses can be made at any time, you need a better way (like Value::isFormula()).

Hope that helps.

Davide