import type { ClassEnumerationDefinition as ClassEnumerationDefinitionBase, ClassEventDefinition as ClassEventDefinitionBase, ClassMethodDefinition as ClassMethodDefinitionBase, ClassPropertyDefinition as ClassPropertyDefinitionBase } from './ClassMember';
import { ClassDefinition } from './ClassDefinition';
import { type RuntimeExpressionValue } from './AST';
import type { RuntimeDisplay } from './RuntimeDisplay';
type ClassPropertyDefinition = ClassPropertyDefinitionBase<ClassDefinition>;
type ClassMethodDefinition = ClassMethodDefinitionBase<ClassDefinition>;
type ClassEventDefinition = ClassEventDefinitionBase<ClassDefinition>;
type ClassEnumerationDefinition = ClassEnumerationDefinitionBase<ClassDefinition>;
/** Member metadata variants that can be exposed as MATLAB-like meta objects. */
type ClassMetaMemberDefinition = ClassPropertyDefinition | ClassMethodDefinition | ClassEventDefinition | ClassEnumerationDefinition;
/** Supported meta-object kind names. */
type ClassMetaKind = 'meta.class' | 'meta.property' | 'meta.method' | 'meta.event' | 'meta.EnumerationMember';
/** Runtime values exposed by public MATLAB-like `meta.*` properties. */
type ClassMetaPropertyValue = RuntimeExpressionValue;
/**
 * Callback used by runtime-created meta objects to evaluate property defaults
 * lazily.
 */
type ClassPropertyDefaultProvider = (property: ClassPropertyDefinition) => RuntimeExpressionValue | undefined;
/**
 * Base class for MATLAB-like class meta objects.
 */
declare abstract class ClassMetaObject {
    /** Runtime type tag used by interpreter predicates. */
    static readonly CLASS_META = 7;
    /** Runtime type tag stored on all meta objects. */
    readonly type = 7;
    /** Optional AST-style parent pointer used by generic value handling. */
    parent?: unknown;
    /** MATLAB-like meta object kind. */
    abstract readonly kind: ClassMetaKind;
    /**
     * Test whether a value is a class meta object.
     *
     * @param obj Value to test.
     * @returns `true` when `obj` is a `ClassMetaObject`.
     */
    static readonly isInstanceOf: (obj: unknown) => obj is ClassMetaObject;
    /**
     * Copy a meta object.
     *
     * Meta objects are immutable views, so copying preserves identity.
     *
     * @param meta Meta object to copy.
     * @returns The same meta object.
     */
    static readonly copy: <T extends ClassMetaObject>(meta: T) => T;
    /**
     * Copy this meta object.
     *
     * @returns This meta object.
     */
    copy(): this;
    /**
     * Read a MATLAB-like public meta property.
     *
     * @param field Property name.
     * @returns Property value, if supported.
     */
    abstract getProperty(field: string): ClassMetaPropertyValue | undefined;
    /**
     * Return the display name used by unparse and diagnostics.
     *
     * @returns Display name.
     */
    abstract displayName(): string;
    /**
     * Render a compact meta-object summary.
     *
     * @param meta Meta object to render.
     * @param _interpreter Interpreter requesting unparse.
     * @returns Human-readable meta-object summary.
     */
    static readonly unparse: (meta: ClassMetaObject, _interpreter: RuntimeDisplay) => string;
}
/**
 * Meta object representing a class definition.
 */
declare class ClassMetaClass extends ClassMetaObject {
    readonly definition: ClassDefinition;
    private readonly propertyDefaultProvider?;
    /** MATLAB-like meta object kind. */
    readonly kind = "meta.class";
    /**
     * Create a class meta object.
     *
     * @param definition Class metadata.
     * @param propertyDefaultProvider Optional callback used to expose evaluated
     * property defaults from runtime-created meta objects.
     */
    private constructor();
    /**
     * Test whether a value is a class meta object.
     *
     * @param obj Value to test.
     * @returns `true` when `obj` is a `ClassMetaClass`.
     */
    static readonly isInstanceOf: (obj: unknown) => obj is ClassMetaClass;
    /**
     * Create a class meta object.
     *
     * @param definition Class metadata.
     * @param propertyDefaultProvider Optional callback used to expose evaluated
     * property defaults from runtime-created meta objects.
     * @returns Class meta object.
     */
    static readonly create: (definition: ClassDefinition, propertyDefaultProvider?: ClassPropertyDefaultProvider) => ClassMetaClass;
    /**
     * Return the class name.
     *
     * @returns Class name.
     */
    displayName(): string;
    /**
     * Read a supported `meta.class` property.
     *
     * @param field Property name.
     * @returns Property value, if supported.
     */
    getProperty(field: string): ClassMetaPropertyValue | undefined;
}
/**
 * Base class for meta objects that wrap class members.
 */
declare abstract class ClassMetaMember extends ClassMetaObject {
    readonly member: ClassMetaMemberDefinition;
    private readonly propertyDefaultProvider?;
    /**
     * Create a member meta object.
     *
     * @param member Member metadata.
     * @param propertyDefaultProvider Optional callback propagated back through
     * `DefiningClass`.
     */
    protected constructor(member: ClassMetaMemberDefinition, propertyDefaultProvider?: ClassPropertyDefaultProvider | undefined);
    /**
     * Return a qualified member display name.
     *
     * @returns Qualified member name.
     */
    displayName(): string;
    /**
     * Read fields shared by property, method, event, and enumeration meta
     * objects.
     *
     * @param field Property name.
     * @returns Property value, if supported by all member meta objects.
     */
    protected commonProperty(field: string): ClassMetaPropertyValue | undefined;
}
/**
 * Meta object representing a class property.
 */
declare class ClassMetaProperty extends ClassMetaMember {
    readonly property: ClassPropertyDefinition;
    private readonly defaultProvider?;
    /** MATLAB-like meta object kind. */
    readonly kind = "meta.property";
    /**
     * Create a property meta object.
     *
     * @param property Property metadata.
     * @param defaultProvider Optional callback used to evaluate the property's
     * default expression lazily.
     */
    private constructor();
    /**
     * Create a property meta object.
     *
     * @param property Property metadata.
     * @param defaultProvider Optional callback used to evaluate the property's
     * default expression lazily.
     * @returns Property meta object.
     */
    static readonly create: (property: ClassPropertyDefinition, defaultProvider?: ClassPropertyDefaultProvider) => ClassMetaProperty;
    /**
     * Return the default value exposed through metadata.
     *
     * Runtime-created meta objects evaluate defaults lazily; parser-created
     * meta objects without a provider expose compact expression text.
     *
     * @returns Evaluated/default expression value, or `null` when absent.
     */
    private defaultValue;
    /**
     * Read a supported `meta.property` property.
     *
     * @param field Property name.
     * @returns Property value, if supported.
     */
    getProperty(field: string): ClassMetaPropertyValue | undefined;
}
/**
 * Meta object representing a class method.
 */
declare class ClassMetaMethod extends ClassMetaMember {
    readonly method: ClassMethodDefinition;
    /** MATLAB-like meta object kind. */
    readonly kind = "meta.method";
    /**
     * Create a method meta object.
     *
     * @param method Method metadata.
     * @param propertyDefaultProvider Optional callback propagated through
     * `DefiningClass`.
     */
    private constructor();
    /**
     * Create a method meta object.
     *
     * @param method Method metadata.
     * @param propertyDefaultProvider Optional callback propagated through
     * `DefiningClass`.
     * @returns Method meta object.
     */
    static readonly create: (method: ClassMethodDefinition, propertyDefaultProvider?: ClassPropertyDefaultProvider) => ClassMetaMethod;
    /**
     * Read a supported `meta.method` property.
     *
     * @param field Property name.
     * @returns Property value, if supported.
     */
    getProperty(field: string): ClassMetaPropertyValue | undefined;
}
/**
 * Meta object representing a class event.
 */
declare class ClassMetaEvent extends ClassMetaMember {
    readonly event: ClassEventDefinition;
    /** MATLAB-like meta object kind. */
    readonly kind = "meta.event";
    /**
     * Create an event meta object.
     *
     * @param event Event metadata.
     * @param propertyDefaultProvider Optional callback propagated through
     * `DefiningClass`.
     */
    private constructor();
    /**
     * Create an event meta object.
     *
     * @param event Event metadata.
     * @param propertyDefaultProvider Optional callback propagated through
     * `DefiningClass`.
     * @returns Event meta object.
     */
    static readonly create: (event: ClassEventDefinition, propertyDefaultProvider?: ClassPropertyDefaultProvider) => ClassMetaEvent;
    /**
     * Read a supported `meta.event` property.
     *
     * @param field Property name.
     * @returns Property value, if supported.
     */
    getProperty(field: string): ClassMetaPropertyValue | undefined;
}
/**
 * Meta object representing an enumeration member.
 */
declare class ClassMetaEnumerationMember extends ClassMetaMember {
    readonly enumeration: ClassEnumerationDefinition;
    /** MATLAB-like meta object kind. */
    readonly kind = "meta.EnumerationMember";
    /**
     * Create an enumeration-member meta object.
     *
     * @param enumeration Enumeration metadata.
     * @param propertyDefaultProvider Optional callback propagated through
     * `DefiningClass`.
     */
    private constructor();
    /**
     * Create an enumeration-member meta object.
     *
     * @param enumeration Enumeration metadata.
     * @param propertyDefaultProvider Optional callback propagated through
     * `DefiningClass`.
     * @returns Enumeration-member meta object.
     */
    static readonly create: (enumeration: ClassEnumerationDefinition, propertyDefaultProvider?: ClassPropertyDefaultProvider) => ClassMetaEnumerationMember;
    /**
     * Read a supported `meta.EnumerationMember` property.
     *
     * @param field Property name.
     * @returns Property value, if supported.
     */
    getProperty(field: string): ClassMetaPropertyValue | undefined;
}
export { ClassMetaObject, ClassMetaClass, ClassMetaMember, ClassMetaProperty, ClassMetaMethod, ClassMetaEvent, ClassMetaEnumerationMember };
export type { ClassMetaKind, ClassMetaPropertyValue };
declare const _default: {
    ClassMetaObject: typeof ClassMetaObject;
    ClassMetaClass: typeof ClassMetaClass;
    ClassMetaMember: typeof ClassMetaMember;
    ClassMetaProperty: typeof ClassMetaProperty;
    ClassMetaMethod: typeof ClassMetaMethod;
    ClassMetaEvent: typeof ClassMetaEvent;
    ClassMetaEnumerationMember: typeof ClassMetaEnumerationMember;
};
export default _default;
