001// Copyright 2023 The Apache Software Foundation
002//
003// Licensed under the Apache License, Version 2.0 (the "License");
004// you may not use this file except in compliance with the License.
005// You may obtain a copy of the License at
006//
007// http://www.apache.org/licenses/LICENSE-2.0
008//
009// Unless required by applicable law or agreed to in writing, software
010// distributed under the License is distributed on an "AS IS" BASIS,
011// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012// See the License for the specific language governing permissions and
013// limitations under the License.
014
015package org.apache.tapestry5.plastic;
016
017/**
018 * <p>
019 * Interface that can be implemented to provide access to field values based on their name.
020 * Usually implemented with {@linkplain PlasticUtils#implementFieldValueProvider(PlasticClass, java.util.Set)},
021 * which doesn't use reflection.
022 * </p>
023 * <p>
024 * The name of its abstract method is intended to avoid clashes with other existing methods
025 * in the class.
026 * </p>
027 * @see PlasticUtils#implementFieldValueProvider(PlasticClass, java.util.Set)
028 * @since 5.8.4
029 */
030public interface FieldValueProvider
031{
032    /**
033     * Returns the value of a given field.
034     * @param fieldName the field name.
035     * @return the field value.
036     */
037    Object __fieldValueProvider__get(String fieldName);
038    
039    /**
040     * <p>
041     * Returns the value of a given field in a given object if it belongs to a class
042     * that implements {@linkplain FieldValueProvider}. Otherwise, it throws an exception.
043     * </p>
044     * <p>
045     * This is an utility method to avoid having to make casts very time you need to call
046     * {@linkplain #__fieldValueProvider__get(String)}.
047     * </p>
048     * @param object an object.
049     * @param fieldName the field name.
050     * @return the field value.
051     */
052    static Object get(Object object, String fieldName)
053    {
054        if (object instanceof FieldValueProvider)
055        {
056            return ((FieldValueProvider) object).__fieldValueProvider__get(fieldName);
057        }
058        else
059        {
060            throw new RuntimeException("Class " + object.getClass().getName() + " doesn't implement " + FieldValueProvider.class.getSimpleName());
061        }
062    }
063    
064}