declare namespace Leaf {
    interface PropertyDefination<T> {
        get?: (cache: PropertyCache<T>) => T;
        set?: (value: T, cache: PropertyCache<T>) => void;
        value?: T;
    }
    interface PropertyCache<T> {
        [index: string]: any;
        value?: T;
    }
    class Property {
        static define<T>(who: any, name: string, def: PropertyDefination<T>): T;
        static with(who: any): WithProperty<{}>;
    }
    class WithProperty<T> {
        who: any;
        constructor(who: any);
        define<T>(name: string, def: PropertyDefination<T>): this;
    }
}
