class MenuMaker::Menu

Attributes

current_depth[W]

Public Class Methods

new(renderer) { |self| ... } click to toggle source
# File lib/menu_maker/menu.rb, line 5
def initialize(renderer)
  @items    = {}
  @renderer = renderer

  yield self if block_given?
end

Public Instance Methods

add(title, *paths, **options) { |current_submenu| ... } click to toggle source
# File lib/menu_maker/menu.rb, line 20
def add(title, *paths, **options)
  @items[title] = MenuItem.new(title, *paths, options)
  @current_item = title

  yield current_submenu if block_given?

  self
end
each(&block) click to toggle source
# File lib/menu_maker/menu.rb, line 16
def each(&block)
  items.each(&block)
end
items() click to toggle source
# File lib/menu_maker/menu.rb, line 12
def items
  @items.values
end
render() click to toggle source
# File lib/menu_maker/menu.rb, line 29
def render
  renderer_for(current_depth).call(self)
end

Private Instance Methods

create_submenu!() click to toggle source
# File lib/menu_maker/menu.rb, line 47
def create_submenu!
  submenu = Menu.new renderer_for(next_depth)
  submenu.current_depth = next_depth

  current_item.submenu = submenu
end
current_depth() click to toggle source
# File lib/menu_maker/menu.rb, line 68
def current_depth
  @current_depth || 1
end
current_item() click to toggle source
# File lib/menu_maker/menu.rb, line 39
def current_item
  @items[@current_item]
end
current_submenu() click to toggle source
# File lib/menu_maker/menu.rb, line 43
def current_submenu
  current_item.submenu || create_submenu!
end
next_depth() click to toggle source
# File lib/menu_maker/menu.rb, line 72
def next_depth
  current_depth + 1
end
renderer_for(depth) click to toggle source
# File lib/menu_maker/menu.rb, line 54
def renderer_for(depth)
  renderer = if @renderer.respond_to? :for_depth
    @renderer.for_depth(depth)
  else
    @renderer
  end

  unless renderer.respond_to? :call
    raise MenuError, "Couldn't find renderer for depth #{depth}"
  end

  renderer
end