export type JinjaExpression = string;
export type VariableChangeListener = (value: any) => void;
export declare class JinjaVariable<Metadata = any> {
    readonly name: string;
    readonly path: string;
    readonly metadata?: Metadata;
    private value;
    private listeners;
    constructor(name: string, value?: any, parent?: string, metadata?: Metadata);
    get(): any;
    set(value: any): void;
    onChange(listener: VariableChangeListener): () => void;
}
export declare class JinjaObjectVariable<T> extends JinjaVariable {
    readonly children: Record<string, JinjaVariable>;
    constructor(name: string, children: Record<string, JinjaVariable>, value?: T, parent?: string);
}
export declare class JinjaExpressionVariable<Metadata = any> extends JinjaVariable<Metadata> {
    /**
     * The value of the variable is actually a Jinja expression involving other variables. This may cause dependency cycles which
     * must be identified and throw before running.
     */
    readonly expression: JinjaExpression;
    constructor(name: string, expression: string, parent?: string, metadata?: Metadata);
}
//# sourceMappingURL=JinjaVariable.d.ts.map