module ActsAsTree::TreeWalker

def self.extended(mod)

def self.extended(mod)
  mod.class_eval do
    def walk_tree(options = {}, &block)
      algorithm = options.fetch :algorithm, :dfs
      where = options.fetch :where, {}
      self.class.send("walk_tree_#{algorithm}", where, self, &block)
    end
  end
end

def walk_tree(options = {}, &block)


the node it is called on.
There is also a walk_tree instance method that starts walking from

<% end %>
<%= link_to "#{' '*level}#{page.name}", page_path(page) %>

<% Page.walk_tree do |page, level| %>
Example of acts_as_tree for model Page (ERB view):

second: The current depth-level within the tree
first: The current node
The given block sets two parameters:

where: AR where statement to filter certain nodes
:bfs for breadth-first search
:dfs for depth-first search (default)
algorithm:
options:

depth-level.
Traverse the tree and call a block with the current node and current
def walk_tree(options = {}, &block)
  algorithm = options.fetch :algorithm, :dfs
  where = options.fetch :where, {}
  send("walk_tree_#{algorithm}", where, &block)
end

def walk_tree(options = {}, &block)

def walk_tree(options = {}, &block)
  algorithm = options.fetch :algorithm, :dfs
  where = options.fetch :where, {}
  self.class.send("walk_tree_#{algorithm}", where, self, &block)
end

def walk_tree_bfs(where = {}, node = nil, level = -1, &block)

def walk_tree_bfs(where = {}, node = nil, level = -1, &block)
  nodes = (node.nil? ? roots : node.children).where(where)
  nodes.each { |child| yield(child, level + 1) }
  nodes.each { |child| walk_tree_bfs where, child, level + 1, &block }
end

def walk_tree_dfs(where = {}, node = nil, level = -1, &block)

def walk_tree_dfs(where = {}, node = nil, level = -1, &block)
  yield(node, level) unless level == -1
  nodes = (node.nil? ? roots : node.children).where(where)
  nodes.each { |child| walk_tree_dfs where, child, level + 1, &block }
end