code: public static Val get(String propertyPrefix, String... propertyComponents) {
        String propertyName = propertyPrefix;
        if (propertyComponents != null && propertyComponents.length > 0) {
           propertyName += "." + StringUtils.join(propertyComponents, ".");
        }
  
        if (StringUtils.isNullOrBlank(propertyName)) {
           return new Val(null);
        }
  
        String value;
        if (getInstance().properties.containsKey(propertyName)) {
           value = getInstance().properties.get(propertyName);
        } else if (System.getProperty(propertyName) != null) {
           value = System.getProperty(propertyName);
        } else {
           value = System.getenv(propertyName);
        }
  
        if (value == null) {
           return new Val(null);
        }
  
        //resolve variables
        if (STRING_SUBSTITUTION.matcher(value).find()) {
           value = resolveVariables(getInstance().properties.get(propertyName));
        }
  
        if (value == null) {
           return new Val(null);
        }
  
        //If the value is a script then process it
        if (value.startsWith(SCRIPT_PROPERTY)) {
           return Val.of(processScript(value));
        }
  
        if (value.contains(BEAN_PROPERTY)) {
           return getBean(value);
        }
  
        return Val.of(value);
     }
docs: <p>Gets the value associated with a property. The property name is constructed as <code>propertyPrefix + . +
  propertyComponent[0] + . + propertyComponent[1] + ...</code></p>
  
  @param propertyPrefix     The prefix
  @param propertyComponents The components
  @return The value for the property