import { CloneContext } from "./cloneContext";
import { Cloner } from "./cloner";
export declare type ClassCloner<T extends object = object> = Cloner & {
    readonly klass: new (...args: any[]) => T;
    clone(input: T, context: CloneContext): T;
};
export declare abstract class BaseClassCloner<T extends object> implements ClassCloner<T> {
    readonly klass: new (...args: any[]) => T;
    constructor(klass: new (...args: any[]) => T);
    canClone<T>(input: T): input is T;
    abstract clone<T>(input: T, context: CloneContext): T;
    abstract clone(input: T, context: CloneContext): T;
    abstract clone(input: any, context: any): T;
}
export declare module ClassCloner {
    function newForClass<T extends object>(klass: new (...args: any[]) => T, factory: (original: T) => T, options?: {
        ignoreKeys?: boolean;
    }): ClassCloner<T>;
    function forClass<T extends object>(klass: new (...args: any[]) => T, factory: (original: T) => T, options?: {
        ignoreKeys?: boolean;
    }): new () => ClassCloner<T>;
}
