First-pass at Component.js