class Rails::Paths::Path

def children

def children
  keys = @root.keys.select { |k| k.include?(@current) }
  keys.delete(@current)
  @root.values_at(*keys.sort)
end

def existent

Returns all expanded paths but only if they exist in the filesystem.
def existent
  expanded.select { |f| File.exists?(f) }
end

def existent_directories

def existent_directories
  expanded.select { |d| File.directory?(d) }
end

def expand_dir(path, glob)

def expand_dir(path, glob)
  Dir.chdir(path) do
    Dir.glob(@glob).map { |file| File.join path, file }.sort
  end
end

def expand_file(path, glob)

def expand_file(path, glob)
  Dir[File.join(path, glob)].sort
end

def expanded

Expands all paths against the root and return all unique values.
def expanded
  raise "You need to set a path root" unless @root.path
  result = []
  each do |p|
    path = File.expand_path(p, @root.path)
    if @glob
      if File.directory? path
        result.concat expand_dir(path, @glob)
      else
        # FIXME: I think we can remove this branch, but I'm not sure.
        # Say the filesystem has this file:
        #
        #   /tmp/foobar
        #
        # and someone adds this path:
        #
        #   /tmp/foo
        #
        # with a glob of "*", then this function will return
        #
        #   /tmp/foobar
        #
        # We need to figure out if that is desired behavior.
        result.concat expand_file(path, @glob)
      end
    else
      result << path
    end
  end
  result.uniq!
  result
end

def first

def first
  expanded.first
end

def initialize(root, current, *paths)

def initialize(root, current, *paths)
  options = paths.last.is_a?(::Hash) ? paths.pop : {}
  super(paths.flatten)
  @current  = current
  @root     = root
  @glob     = options[:glob]
  options[:autoload_once] ? autoload_once! : skip_autoload_once!
  options[:eager_load]    ? eager_load!    : skip_eager_load!
  options[:autoload]      ? autoload!      : skip_autoload!
  options[:load_path]     ? load_path!     : skip_load_path!
end

def last

def last
  expanded.last
end