     @add_dependencies('computed_bounds', this, ['bounds'])
     @add_dependencies('computed_bounds', @get('plot'), ['x_range', 'y_range'])
 
-    @define_computed_property('rule_coords', @_rule_coords, false)
-    @add_dependencies('rule_coords', this, ['computed_bounds', 'side'])
-
-    @define_computed_property('tick_coords', @_tick_coords, false)
-    @add_dependencies('tick_coords', this, ['computed_bounds', 'panel_side'])
-
-    @define_computed_property('ranges', @_ranges, true)
-    @define_computed_property('normals', (() -> @panel._normals), true)
-    @define_computed_property('dimension', (() -> @panel._dim), true)
-    @define_computed_property('offsets', @_offsets, true)
+  @getters {
+    rule_coords: () -> @_rule_coords()
+    tick_coords: () -> @_tick_coords()
+    ranges: () -> @_ranges()
+    normals: () -> @panel._normals
+    dimension: () -> @panel._dim
+    offsets: () -> @_offsets()
+  }
 
   add_panel: (side) ->
     @panel = new SidePanel.Model({side: side})

  _draw_rule: (ctx) ->
    if not @visuals.axis_line.doit
      return
    [x, y] = coords = @mget('rule_coords')
    [sx, sy] = @plot_view.map_to_screen(x, y, @_x_range_name, @_y_range_name)
    [nx, ny] = @mget('normals')
    [xoff, yoff]  = @mget('offsets')
    @visuals.axis_line.set_value(ctx)
    ctx.beginPath()
    ctx.moveTo(Math.round(sx[0]+nx*xoff), Math.round(sy[0]+ny*yoff))

    return coords

  _tick_coords: () ->
    i = @dimension
    j = (i + 1) % 2
    [range, cross_range] = @ranges
    [start, end] = @get('computed_bounds')

    ticks = @get('ticker').get_ticks(start, end, range, {})
