@Override
        public AttributeValue getProperty(String key) {
            switch (value.getType()) {
                case OBJECT:
                    ObjectNode objectNode = value.expectObjectNode();
                    switch (key) {
                        case KEYS:
                            return project(objectNode.getMembers().keySet());
                        case VALUES:
                            return project(objectNode.getMembers().values());
                        case LENGTH:
                            return AttributeValue.literal(objectNode.getMembers().size());
                        default:
                            return value.expectObjectNode()
                                    .getMember(key)
                                    .<AttributeValue>map(NodeValue::new)
                                    .orElse(EMPTY);
                    }
                case ARRAY:
                    ArrayNode arrayNode = value.expectArrayNode();
                    switch (key) {
                        case VALUES:
                            return project(arrayNode.getElements());
                        case LENGTH:
                            return AttributeValue.literal(arrayNode.size());
                        default:
                            return EMPTY;
                    }
                case STRING:
                    if (key.equals(LENGTH)) {
                        return AttributeValue.literal(value.expectStringNode().getValue().length());
                    }
                    // fall through
                default:
                    return EMPTY;
            }
        }
An attribute that contains a {@link Node}.

<p>This kind of attribute is typically used when traversing into trait values.
Properties of object nodes can be selected by name. {@link NullNode} are
not considered present. The (values) pseudo-property can be used on object
nodes and array nodes. The (keys) pseudo-property can be used on object nodes.
smithy-model/src/main/java/software/amazon/smithy/model/selector/AttributeValueImpl.java