```coffeescript
class @IntermediateModel
  _events: {}
  data: []

  constructor: ->
    @fetch()

  get: (key) ->
    @[key]

  set: (key, value, silent) ->
    @[key] = value
    if not @_events[key] or silent
      return
    for callback in @_events[key]
      (callback)()

  onChange: (key, callback) ->
    @_events[key] = @_events[key] or []
    @_events[key].push(callback)

  fetch: ->
    setTimeout( =>
      res = @genData()
      @set('data', res)
    , 300)

  genData: ->
    allData = [
      { name: 'AAA', amount: 3000 }
      { name: 'BBB', amount: 1000 }
      { name: 'CCC', amount: 2000 }
      { name: 'DDD', amount: 5000 }
      { name: 'EEE', amount: 10000 }
      { name: 'FFF', amount: 1000 }
      { name: 'GGG', amount: 3000 }
      { name: 'HHH', amount: 1000 }
      { name: 'III', amount: 2000 }
      { name: 'JJJ', amount: 5000 }
      { name: 'KKK', amount: 10000 }
    ]
    allData.sort((x, y) ->
      Math.random() - Math.random()
    )
    allData[0...5]
```

Remove black-magic from set method
user
```coffeescript
class @IntermediateModel
  _events: {}
  data: []

  constructor: ->
    @fetch()

  get: (key) ->
    @[key]

  set: (key, value) ->
    @[key] = value

  on: (eventName, callback) ->
    @_events[eventName] = @_events[eventName] or []
    @_events[eventName].push(callback)

  onChange: (key, callback) ->
    @on('change_' + key, callback)

  emit: (eventName) ->
    for callback in @_events[eventName]
      callback()

  fetch: ->
    setTimeout( =>
      res = @genData()
      @set('data', res)
      @emit('change_data')
    , 300)

  genData: ->
    allData = [
      { name: 'AAA', amount: 3000 }
      { name: 'BBB', amount: 1000 }
      { name: 'CCC', amount: 2000 }
      { name: 'DDD', amount: 5000 }
      { name: 'EEE', amount: 10000 }
      { name: 'FFF', amount: 1000 }
      { name: 'GGG', amount: 3000 }
      { name: 'HHH', amount: 1000 }
      { name: 'III', amount: 2000 }
      { name: 'JJJ', amount: 5000 }
      { name: 'KKK', amount: 10000 }
    ]
    allData.sort((x, y) ->
      Math.random() - Math.random()
    )
    allData[0...5]
```
assistant