class ObjectBasedValueSource extends AbstractValueSource {

    private final Object root;

    /**
     * Construct a new value source, using the supplied object as the root from
     * which to start, and using expressions split at the dot ('.') to navigate
     * the object graph beneath this root.
     * @param root the root of the graph.
     */
    public ObjectBasedValueSource(Object root) {
        super(true);
        this.root = root;
    }

    /**
     * <p>Split the expression into parts, tokenized on the dot ('.') character. Then,
     * starting at the root object contained in this value source, apply each part
     * to the object graph below this root, using either 'getXXX()' or 'isXXX()'
     * accessor types to resolve the value for each successive expression part.
     * Finally, return the result of the last expression part's resolution.</p>
     *
     * <p><b>NOTE:</b> The object-graph nagivation actually takes place via the
     * {@link ReflectionValueExtractor} class.</p>
     */
    public Object getValue(String expression) {<FILL_FUNCTION_BODY>}
}

        if (expression == null || expression.trim().isEmpty()) {
            return null;
        }

        try {
            return ReflectionValueExtractor.evaluate(expression, root, false);
        } catch (Exception e) {
            addFeedback("Failed to extract \'" + expression + "\' from: " + root, e);
        }

        return null;
    
<no_super_class>