class PojoPropertyUtilsBean extends PropertyUtilsBean {

    @Override
    public boolean isWriteable(Object bean, String name) {
        // Validate method parameters
        if (bean == null) {
            throw new IllegalArgumentException("No bean specified");
        }
        if (name == null) {
            throw new IllegalArgumentException("No name specified for bean class '" +
                    bean.getClass() + "'");
        }

       // Begin Kuali foundation modification

        Resolver nestedResolver = getResolver();

        // Resolve nested references
        while (nestedResolver.hasNested(name)) {
            String next = nestedResolver.next(name);
            Object nestedBean = null;

            try {
                nestedBean = getProperty(bean, next);

                // If an object on which we're trying to set a value is null,
                // 1: get its type
                // 2: if it's not an interface, create an instance of it and set the property
                // 2a: if it is an interface, we can't instantiate it, so the property shouldn't be writeable.
                if (nestedBean == null) {

                    Class propertyType = getPropertyType(bean, next);
                    if (propertyType != null && !propertyType.isInterface()) {
                        Object newInstance = ObjectUtils.createNewObjectFromClass(propertyType);
                        setSimpleProperty(bean, next, newInstance);
                        nestedBean = getSimpleProperty(bean, next);
                    } else {
                        return false;
                    }
                }
            } catch (IllegalAccessException e) {
                return false;
            } catch (InvocationTargetException e) {
                return false;
            } catch (NoSuchMethodException e) {
                return false;
            }

            bean = nestedBean;
            name = nestedResolver.remove(name);
        }

        // End Kuali foundation modification

        // Remove any subscript from the final name value
        name = getResolver().getProperty(name);

        // Treat WrapDynaBean as special case - may be a read-only property
        // (see Jira issue# BEANUTILS-61)
        if (bean instanceof WrapDynaBean) {
            bean = ((WrapDynaBean)bean).getInstance();
        }

        // Return the requested result
        if (bean instanceof DynaBean) {
            // All DynaBean properties are writeable
            return (((DynaBean) bean).getDynaClass().getDynaProperty(name) != null);
        } else {
            try {
                PropertyDescriptor desc =
                        getPropertyDescriptor(bean, name);
                if (desc != null) {
                    Method writeMethod = desc.getWriteMethod();
                    if (writeMethod == null) {
                        if (desc instanceof IndexedPropertyDescriptor) {
                            writeMethod = ((IndexedPropertyDescriptor) desc).getIndexedWriteMethod();
                        } else if (desc instanceof MappedPropertyDescriptor) {
                            writeMethod = ((MappedPropertyDescriptor) desc).getMappedWriteMethod();
                        }
                        writeMethod = MethodUtils.getAccessibleMethod(bean.getClass(), writeMethod);
                    }
                    return (writeMethod != null);
                } else {
                    return (false);
                }
            } catch (IllegalAccessException e) {
                return (false);
            } catch (InvocationTargetException e) {
                return (false);
            } catch (NoSuchMethodException e) {
                return (false);
            }
        }

    }

    public  PojoPropertyUtilsBean();

}