code: function Haiku(options){
    var haiku = this
  
    options = options || {}
  
    // allow a single string opt to be the src
    //
    //    haiku('path/to/mysite.com')
    //
    if (typeof options === 'string') options = { src: options }
  
    prr(haiku, 'options', { src: options.src || process.cwd()
    , markdown: marked
    })
    prr(haiku, 'state', 'new', { writable: true })
    prr(haiku, 'entities', {})
    prr(haiku, 'transforms', [])
  
    // inherits from a basic EventEmitter below, make sure it's ctor gets called.
    EE.call(haiku)
    haiku.setMaxListeners(Infinity)
  
    haiku.on('reading', function(){ haiku.state = 'reading' })
    haiku.on('read',    function(){ haiku.state = 'read'    })
  
    // defaults
    // needs `haiku.options.src` defined ahead of calling `haiku.resolve()`
    allowedopts.forEach(function(opt){
      // only resolve -dir suffixed options
      if (! opt.match('-dir')) return
  
      var dirname = opt.replace('-dir', '')
      haiku.options[opt] = haiku.resolve(dirname)
    })
  
    haiku.configure(options)
  
    // has to be defined after opts are configured
    prr(haiku, 'templates', templates(haiku.opt('templates-dir')), { writable: true })
  }
docs: /*
  
  states: new, reading, read
  events: error, reading, read