class IDL::AST::Node

def children

def children
  @children
end

def copy_from(_template, instantiation_context)

def copy_from(_template, instantiation_context)
  super
  _template.__send__(:walk_members_for_copy) do |child|
    _child_copy = child.instantiate(instantiation_context, self)
    @children << _child_copy
    # introduce unless already introduced (happens with module chains)
    @introduced[_child_copy.intern] = _child_copy unless @introduced.has_key?(_child_copy.intern)
  end
  self
end

def define(_type, _name, params = {})

def define(_type, _name, params = {})
  unless is_definable?(_type)
    raise "#{_type.to_s} is not definable in #{self.typename}."
  end
  node = search_self(_name)
  if node.nil?
    node = _type.new(_name, self, params)
    node.annotations.concat(params[:annotations])
    node.prefix = @prefix
    introduce(node)
    @children << node
  else
    if _type != node.class
      raise "#{_name} is already defined as a type of #{node.typename}"
    end
    node = redefine(node, params)
  end
  node
end

def initialize(name, enclosure)

def initialize(name, enclosure)
  super
  @introduced = {}
  @children = []
  introduce(self)
end

def introduce(node)

def introduce(node)
  n = (@introduced[node.intern] ||= node)
  raise "#{node.name} is already introduced as a #{n.scoped_name} of #{n.typename}." if n != node
end

def is_definable?(_type)

def is_definable?(_type)
  self.class::DEFINABLE.any? do |target|
    _type.ancestors.include? target
  end
end

def marshal_dump

def marshal_dump
  super() << @children << @introduced
end

def marshal_load(vars)

def marshal_load(vars)
  @introduced = vars.pop
  @children = vars.pop
  super(vars)
end

def match_members(&block)

def match_members(&block)
  !(@children.find(&block)).nil?
end

def redefine(node, _params)

def redefine(node, _params)
  raise "\"#{node.name}\" is already defined."
end

def replace_prefix(pfx)

def replace_prefix(pfx)
  super
  walk_members { |m| m.replace_prefix(pfx) }
end

def resolve(_name)

def resolve(_name)
  node = search_enclosure(_name)
  @introduced[node.intern] = node unless node.nil?
  node
end

def search_enclosure(_name)

def search_enclosure(_name)
  node = search_self(_name)
  if node.nil? and not @enclosure.nil?
    node = @enclosure.search_enclosure(_name)
  end
  node
end

def search_self(_name)

def search_self(_name)
  key = _name.downcase.intern
  node = @introduced[key]
  if not node.nil? and node.name != _name
    raise "\"#{_name}\" clashed with \"#{node.name}\"."
  end
  node
end

def select_members(&block)

def select_members(&block)
  @children.select(&block)
end

def undo_introduction(node)

def undo_introduction(node)
  @introduced.delete(node.intern)
end

def walk_members(&block)

def walk_members(&block)
  @children.each(&block)
end

def walk_members_for_copy(&block)

def walk_members_for_copy(&block)
  self.walk_members(&block)
end