# File lib/mcollective/matcher.rb, line 130
    def self.eval_compound_fstatement(function_hash)
      l_compare = execute_function(function_hash)

      # Prevent unwanted discovery by limiting comparison operators
      # on Strings and Booleans
      if((l_compare.is_a?(String) || l_compare.is_a?(TrueClass) || l_compare.is_a?(FalseClass)) && function_hash["operator"].match(/<|>/))
        Log.debug "Cannot do > and < comparison on Booleans and Strings '#{l_compare} #{function_hash["operator"]} #{function_hash["r_compare"]}'"
        return false
      end

      # Prevent backticks in function parameters
      if function_hash["params"] =~ /`/
        Log.debug("Cannot use backticks in function parameters")
        return false
      end

      # Escape strings for evaluation
      function_hash["r_compare"] = "\"#{function_hash["r_compare"]}\"" if(l_compare.is_a?(String)  && !(function_hash["operator"] =~ /=~|!=~/))

      # Do a regex comparison if right compare string is a regex
      if function_hash["operator"] =~ /(=~|!=~)/
        # Fail if left compare value isn't a string
        unless l_compare.is_a?(String)
          Log.debug("Cannot do a regex check on a non string value.")
          return false
        else
          compare_result = l_compare.match(function_hash["r_compare"])
          # Flip return value for != operator
          if function_hash["operator"] == "!=~"
            !((compare_result.nil?) ? false : true)
          else
            (compare_result.nil?) ? false : true
          end
        end
        # Otherwise evaluate the logical comparison
      else
        l_compare = "\"#{l_compare}\"" if l_compare.is_a?(String)
        result = eval("#{l_compare} #{function_hash["operator"]} #{function_hash["r_compare"]}")
        (result.nil?) ? false : result
      end
    end