001/*
002 * JDrupes Builder
003 * Copyright (C) 2025 Michael N. Lipp
004 * 
005 * This program is free software: you can redistribute it and/or modify
006 * it under the terms of the GNU Affero General Public License as
007 * published by the Free Software Foundation, either version 3 of the
008 * License, or (at your option) any later version.
009 *
010 * This program is distributed in the hope that it will be useful,
011 * but WITHOUT ANY WARRANTY; without even the implied warranty of
012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
013 * GNU Affero General Public License for more details.
014 *
015 * You should have received a copy of the GNU Affero General Public License
016 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
017 */
018
019package org.jdrupes.builder.api;
020
021/// The Interface defines the type used as key for a [Project]'s properties.
022/// Implementations of this interface should extends [Enum]. See
023/// [Project.Properties] for an example.
024///
025public interface PropertyKey {
026
027    /// The property's name.
028    ///
029    /// @return the string
030    ///
031    String name();
032
033    /// The property's type. Returns `Object.class` if the default value
034    /// is `null`.
035    ///
036    /// @return the class
037    ///
038    default Class<?> type() {
039        if (defaultValue() == null) {
040            return Object.class;
041        }
042        return defaultValue().getClass();
043    }
044
045    /// The property's default value. This value must not be `null`.
046    ///
047    /// @param <T> the generic type
048    /// @return the object
049    ///
050    <T> T defaultValue();
051
052}