module Middleman::ThorActions

def add_clean_up_callback

def add_clean_up_callback
  clean_up_callback = lambda do 
    files       = @cleaning_queue.select { |q| File.file? q }
    directories = @cleaning_queue.select { |q| File.directory? q }
    files.each { |f| remove_file f, :force => true }
    directories = directories.sort_by {|d| d.length }.reverse!
    directories.each do |d|
      remove_file d, :force => true if directory_empty? d 
    end
  end
  self.class.after_run :clean_up_callback do
    clean_up_callback.call
  end
end

def clean!(destination)

def clean!(destination)
  return unless cleaning?
  queue_current_paths_from destination
  add_clean_up_callback
end

def cleaning?

def cleaning?
  options.has_key?("clean") && options["clean"]
end

def dequeue_file_from(destination)

def dequeue_file_from(destination)
  @cleaning_queue.delete_if {|q| q == destination }
end

def directory_empty?(directory)

def directory_empty?(directory)
  Dir["#{directory}/*"].empty?
end

def queue_current_paths_from(destination)

def queue_current_paths_from(destination)
  @cleaning_queue = []
  Find.find(destination) do |path|
    next if path.match(/\/\./)
    unless path == destination
      @cleaning_queue << path.sub(destination, destination[/([^\/]+?)$/])
    end
  end
end

def tilt_template(source, *args, &block)

def tilt_template(source, *args, &block)
  config = args.last.is_a?(Hash) ? args.pop : {}
  destination = args.first || source
  
  # source  = File.expand_path(find_in_source_paths(source.to_s))
  # context = instance_eval('binding')
  
  request_path = destination.sub(/^#{SHARED_SERVER.build_dir}/, "")
  
  begin
    destination, request_path = SHARED_SERVER.reroute_builder(destination, request_path)
    
    request_path.gsub!(/\s/, "%20")
    response = Middleman::Builder.shared_rack.get(request_path)
    
    dequeue_file_from destination if cleaning?
    create_file destination, nil, config do
      response.body
    end if response.status == 200
  rescue
  end
end