@Override
    public Object get(String name, Scriptable start) {
        // When used as a constructor, ScriptRuntime.newObject() asks
        // for our prototype to create an object of the correct type.
        // We don't really care what the object is, since we're returning
        // one constructed out of whole cloth, so we return null.
        if (name.equals("prototype"))
            return null;

         if (staticFieldAndMethods != null) {
            Object result = staticFieldAndMethods.get(name);
            if (result != null)
                return result;
        }

        if (members.has(name, true)) {
            return members.get(this, name, javaObject, true);
        }
        
        if (javaClassPropertyName.equals(name)) {
            Context cx = Context.getContext();
            Scriptable scope = ScriptableObject.getTopLevelScope(start);
            return cx.getWrapFactory().wrap(cx, scope, javaObject, 
                                            ScriptRuntime.ClassClass);
        }
        
        // experimental:  look for nested classes by appending $name to
        // current class' name.
        Class<?> nestedClass = findNestedClass(getClassObject(), name);
        if (nestedClass != null) {
            NativeJavaClass nestedValue = new NativeJavaClass
                (ScriptableObject.getTopLevelScope(this), nestedClass);
            nestedValue.setParentScope(this);
            return nestedValue;
        }
        
        throw members.reportMemberNotFound(name);
    }