/#!/JoePea (2016-08-11T00:04:28.000Z)
I found a solution that works in environments compiled by Babel, using the
[workaround suggested by Ben Newman](https://github.com/
meteor/meteor/issues/7621#issuecomment-238992688):

```js
// --- Module A

import C from './C'

let A = A // @benjamn's workaround applied

export
function setUpA(C) {

    A = class A extends C {
        // ...
    }

}

export {A as default}
```

```js
// --- Module B

import C from './C'

let B = B // @benjamn's workaround applied

export
function setUpB(C) {

    B = class B extends C {
        // ...
    }

}

export {B as default}
```

```js
// --- Module C

import A, {setUpA} from './A'
import B, {setUpB} from './B'

let C = class C {
    constructor() {
        // this may run later, after all three modules are evaluated, or
        // possibly never.
        console.log(A)
        console.log(B)
    }
}

setUpA(C)
setUpB(C)

export {C as default}
```

```js
// --- Entrypoint

import A from './A'
console.log('Entrypoint', new A) // runs the console.logs in the C
constructor.
```


Although that works in my environment which is compiled from ES6 modules to
CommonJS by Babel, it [doesn't work in Rollup.js](http://goo.gl/PXXBKI),
and may not work in other ES6 module implementations.

Is there some solution that will theoretically work in any ES6 module
environment?

*/#!/*JoePea
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20160810/07e0b7b4/attachment-0001.html>
forbes at lindesay.co.uk (2016-08-25T10:37:59.105Z)
I found a solution that works in environments compiled by Babel, using the
[workaround suggested by Ben Newman](https://github.com/meteor/meteor/issues/7621#issuecomment-238992688):

```js
// --- Module A

import C from './C'

let A = A // @benjamn's workaround applied

export
function setUpA(C) {

    A = class A extends C {
        // ...
    }

}

export {A as default}
```

```js
// --- Module B

import C from './C'

let B = B // @benjamn's workaround applied

export
function setUpB(C) {

    B = class B extends C {
        // ...
    }

}

export {B as default}
```

```js
// --- Module C

import A, {setUpA} from './A'
import B, {setUpB} from './B'

let C = class C {
    constructor() {
        // this may run later, after all three modules are evaluated, or
        // possibly never.
        console.log(A)
        console.log(B)
    }
}

setUpA(C)
setUpB(C)

export {C as default}
```

```js
// --- Entrypoint

import A from './A'
console.log('Entrypoint', new A) // runs the console.logs in the C
constructor.
```


Although that works in my environment which is compiled from ES6 modules to
CommonJS by Babel, it [doesn't work in Rollup.js](http://goo.gl/PXXBKI),
and may not work in other ES6 module implementations.

Is there some solution that will theoretically work in any ES6 module
environment?