 
       objects.invoke "trigger", "overlay", canvas
 
+  self.include(Bounded)
+
+  # The order of theses includes is important for
+  # the way in wich they modify the camera view transform
   self.include(Camera.ZSort)
   self.include(Camera.Zoom)
   self.include(Camera.Rotate)


  return self


      currentObject = object
      currentType = type

    objectFilterChain: (fn) ->
      objectFilters.push fn

    transformFilterChain: (fn) ->
      transformFilters.push fn

  self.include(Bindable)

  self.attrAccessor "transform"

  self.bind "afterUpdate", ->
    if currentObject
      followTypes[currentType](currentObject)

    # Hard clamp camera to world bounds
    I.x = I.x.clamp(I.cameraBounds.left + I.screen.width/2, I.cameraBounds.right - I.screen.width/2)
    I.y = I.y.clamp(I.cameraBounds.top + I.screen.height/2, I.cameraBounds.bottom - I.screen.height/2)

    I.transform = Matrix.translate(-I.x, -I.y)

  self.bind "draw", (canvas, objects) ->
    # Move to correct screen coordinates
    canvas.withTransform Matrix.translate(I.screen.x, I.screen.y), (canvas) ->
      canvas.clip(0, 0, I.screen.width, I.screen.height)

      objects = objectFilters.pipeline(objects)
      transform = transformFilters.pipeline(self.transform().copy())

      canvas.withTransform Matrix.translation(I.screen.width/2, I.screen.height/2), (canvas) ->
        canvas.withTransform transform, (canvas) ->
          self.trigger "beforeDraw", canvas
          objects.invoke "draw", canvas

      self.trigger 'flash', canvas

