public function replaceTokens($text, $tokens = [])
    {
        // Obtain Token Mappings:
        
        $mappings = $this->getTokenMappings();
        
        // Iterate Token Mappings:
        
        foreach ($mappings as $name => $spec) {
            
            // Ignore Custom Mappings:
            
            if (isset($spec['custom']) && $spec['custom']) {
                continue;
            }
            
            // Check Property Defined:
                
            if (!isset($spec['property'])) {
                throw new Exception(sprintf('Property is undefined for token mapping "%s"', $name));
            }
            
            // Obtain Value for Token:
            
            $value = isset($tokens[$name]) ? $tokens[$name] : $this->getPropertyValue($spec['property']);
            
            // Perform Token Replacement:
            
            $text = str_ireplace("{{$name}}", $value, $text);
            
        }
        
        // Answer Processed Text:
        
        return $text;
    }