import { MetadataObject } from "../types/meta";
import { INamespacedResourceClient } from "../resource";
export interface Store<R extends MetadataObject> {
    store(obj: R): void;
    get(namespace: string, name: string): Promise<R | undefined>;
    pull(obj: R): void;
}
export interface ObservableStore<R extends MetadataObject> extends Store<R> {
    onStoredOrUpdated(fn: (obj: R) => any): void;
    onRemoved(fn: (obj: R) => any): void;
}
export declare class ObservableStoreDecorator<R extends MetadataObject> implements ObservableStore<R> {
    private inner;
    private onStoreHandlers;
    private onRemoveHandlers;
    constructor(inner: Store<R>);
    onStoredOrUpdated(fn: (obj: R) => any): void;
    onRemoved(fn: (obj: R) => any): void;
    get(namespace: string, name: string): Promise<R | undefined>;
    pull(obj: R): void;
    store(obj: R): void;
}
export declare class InMemoryStore<R extends MetadataObject> implements Store<R> {
    private objects;
    store(obj: R): void;
    pull(obj: R): void;
    get(namespace: string, name: string): Promise<R | undefined>;
}
export declare class CachingLookupStore<R extends MetadataObject> implements Store<R> {
    private api;
    private cache;
    constructor(api: INamespacedResourceClient<R, any, any>);
    store(obj: R): void;
    get(namespace: string, name: string): Promise<R | undefined>;
    pull(obj: R): void;
}
