diff --git a/Cellar/homebrew/brew b/Cellar/homebrew/brew
index d857c60687a555e323489d8c327d7ebbb2e87619..9782c4edd4a33e34c26af5871eb740b400593336 100755
--- a/Cellar/homebrew/brew
+++ b/Cellar/homebrew/brew
@@ -3,7 +3,10 @@
 # Licensed as per the GPL version 3
 require 'find'
 require 'pathname'
-$root = Pathname.new(__FILE__).realpath.dirname.parent.parent
+$:.unshift "#{File.dirname __FILE__}/../Cellar/homebrew"
+$root=Pathname.new(__FILE__).realpath.dirname.parent.parent
+$formula=$root+'Formula'
+$cellar=$root+'Cellar'
 
 def prune
   n=0
@@ -25,95 +28,224 @@ def prune
     end
   end
   # entries lists '.' and '..' so 2 is minimum basically
-  dirs.sort.reverse_each { |d| d.rmdir if d.children.length == 0 }
+  dirs.sort.reverse_each do |d|
+    if d.children.length == 0
+      d.rmdir
+      n+=1
+    end
+  end
   return n
 end
 
-case ARGV[0]
-  when 'brew', 'install' then
-    abort "You must specify a Formula" unless ARGV[1]
-    ARGV.shift
-    file="#{$root}/Formula/#{ARGV.shift}"
-    file+='.rb' unless File.exist? file
-    system "ruby #{file} #{ARGV.join ' '}"
-
-  when 'rm', 'uninstall' then
-    path=$root+'Cellar'+ARGV[1]
-    abort "#{ARGV[1]} is not installed" unless path.directory?
-    path.rmtree
-    prune
-    puts "#{path} removed"
-
-  when 'ln' then
-    target=Pathname.new(ARGV[1])
-    target=$root+'Cellar'+target unless target.exist?
-
-    abort "#{target} is not a directory" unless target.directory?
-
-    target=target.realpath
-
-    if target.parent.parent == $root
-      # we are one dir too high
-      kids=target.children
-      abort "#{target} is empty :(" if kids.length == 0
-      abort "There are multiple versions of #{target.basename} installed please specify one" if kids.length > 1
-      target=target.children.first
-      abort "#{target} is not a directory!" unless target.directory?
-    elsif target.parent.parent.parent != $root
-      abort '#{target} is not a keg'
-    end
+def shift_formulae
+  name=Pathname.new ARGV.shift
 
-    #TODO you should mkdirs as you find them and symlink files otherwise
-    #TODO consider using hardlinks
+  return name if name.directory? and name.parent.realpath == $cellar
+  return File.basename(name, '.rb') if name.file? and name.extname == '.rb' and name.parent.realpath == $formula
 
-    n=0
-    target.find do |from|
-      next if from == ARGV[1] #rubysucks
+  name=name.to_s
+  raise "#{name} is an invalid name for a formula" if name.include? '/'
 
-      to=$root+from.relative_path_from(target)
+  return name if ($formula+(name+'.rb')).file?
+  return name if ($cellar+name).directory?
 
-      if from.directory?
-        to.mkpath unless to.exist?
-      elsif from.file?
-        tod=to.dirname
-        Dir.chdir(tod) do
-          `ln -sf "#{from.relative_path_from tod}"`
-          n+=1
-        end
-      end
+  raise "No formula or keg for #{name} found"
+end
+
+def __class name
+  #remove invalid characters and camelcase
+  name.capitalize.gsub(/[-_\s]([a-zA-Z0-9])/) { $1.upcase }
+end
+
+def __rb name
+  $formula+(name+'.rb')
+end
+
+def __obj name
+  require "#{__rb name}"
+  o=eval(__class(name)).new
+  o.name=name
+  return o
+end
+
+def rm keg
+  #TODO if multiple versions don't rm all unless --force
+  path=$cellar+keg
+  path.rmtree
+  puts "#{path} removed (#{prune} files)"
+end
+
+def ln name
+  keg=$cellar+name
+  keg=keg.realpath
+
+  if keg.parent.parent == $root
+    # we are one dir too high
+    kids=keg.children
+    raise "#{keg} is empty :(" if kids.length == 0
+    raise "There are multiple versions of #{keg.basename} installed please specify one" if kids.length > 1
+    keg=keg.children.first
+    raise "#{keg} is not a directory" unless keg.directory?
+  elsif keg.parent.parent.parent != $root
+    raise '#{keg} is not a keg'
+  end
+
+  #TODO consider using hardlinks
+
+  # yeah indeed, you have to force anything you want in the main tree into
+  # these directories :P
+  $n=0
+  lnd(keg, 'etc') {nil}
+  lnd(keg, 'include') {nil}
+  
+  lnd(keg, 'lib') do |path|
+    :mkpath if ['pkgconfig','php'].include? path.to_s
+  end
+
+  lnd(keg, 'bin') do |path| 
+    if path.extname.to_s == '.app'
+      # no need to put .app bundles in the path, just use spotlight, or the
+      # open command
+      :skip
+    else
+      :mkpath
     end
-    puts "Created #{n} links"
-
-  when 'abv', 'stats', 'statistics'
-    cellar=$root+'Cellar'
-    print `find #{cellar} -type f | wc -l`.strip+' files, '+`du -hd0 #{cellar} | cut -d"\t" -f1`.strip
-
-  when 'prune', 'pasteurize' then
-    puts "Pruned #{prune} files"
-
-  when 'prefix'
-    # Get the clean path to $prefix/Cellar/homebrew/brew/../../../
-    # Don't resolve any symlinks of that final result.
-    # Rationale: if the user calls /usr/local/bin/brew but that will resolve
-    # to /Brewery/Cellar/homebrew/brew we should give /usr/local and not
-    # /Brewery because the user probably has chosen /usr/local as the Homebrew
-    # to expose to the system.
-    if File.symlink? __FILE__
-      # using pathname as it will handle readlink returning abs or rel paths
-      d=Pathname.new(__FILE__).dirname
-      puts File.expand_path(d+File.readlink(__FILE__)+'../../../')
+  end
+
+  lnd(keg, 'share') do |path|
+    path=path.to_s
+    if ['man','doc','locale','info'].include? path
+      :mkpath
     else
-      # Dir.pwd resolves the symlink :P #rubysucks
-      # we use the cwd because __FILE__ can be relative and expand_path 
-      # resolves the symlink for the working directory if fed a relative path
-      # SIGH
-      cwd=Pathname.new `pwd`.strip
-      puts File.expand_path(cwd+__FILE__+'../../../')
+      mans=(1..9).collect {|x| "man/man#{x}"}
+      :mkpath if mans.include? path
+    end
+  end
+
+  return $n
+end
+
+def symlink_relative_to from, to
+  tod=to.dirname
+  tod.mkpath
+  Dir.chdir(tod) do
+    #TODO use ruby function so we get exceptions
+    `ln -sf "#{from.relative_path_from tod}"`
+    $n+=1
+  end
+end
+
+# symlinks a directory recursively into our FHS tree
+def lnd keg, start
+  start=keg+start
+  return unless start.directory?
+
+  start.find do |from|
+    next if from == start
+
+    prune=false    
+    relative_path=from.relative_path_from keg
+    to=$root+relative_path
+
+    if from.directory?
+      cmd=yield from.relative_path_from(start)
+      
+      if :skip == cmd
+        Find.prune
+      elsif :mkpath == cmd
+        to.mkpath
+        $n+=1
+      else
+        symlink_relative_to from, to
+        Find.prune
+      end
+    elsif from.file?
+      symlink_relative_to from, to
     end
+  end
+end
+
+def prefix
+  # Get the clean path to $prefix/Cellar/homebrew/brew/../../../
+  # Don't resolve any symlinks of that final result.
+  # Rationale: if the user calls /usr/local/bin/brew but that will resolve
+  # to /Brewery/Cellar/homebrew/brew we should give /usr/local and not
+  # /Brewery because the user probably has chosen /usr/local as the Homebrew
+  # to expose to the system.
+  if File.symlink? __FILE__
+    # using pathname as it will handle readlink returning abs or rel paths
+    d=Pathname.new(__FILE__).dirname
+    File.expand_path(d+File.readlink(__FILE__)+'../../../')
+  else
+    # Dir.pwd resolves the symlink :P #rubysucks
+    # we use the cwd because __FILE__ can be relative and expand_path
+    # resolves the symlink for the working directory if fed a relative path
+    # SIGH
+    cwd=Pathname.new `pwd`.strip
+    File.expand_path(cwd+__FILE__+'../../../')
+  end
+end
+
+def usage
+  name=File.basename $0
+  <<-EOS
+Usage: #{name} [abv] [prune] [--prefix] [--cache]
+Usage: #{name} [install] [ln] [rm] [info] [list] beverage
+  EOS
+end
 
-  when 'cache'
-    puts File.expand_path('~/Library/Application Support/Homebrew')
+######################################################################### impl
+begin
+  #TODO proper options parsing so --options can go first if necessary
+  
+  case ARGV.shift
+    when 'abv'
+      `find #{$cellar} -type f | wc -l`.strip+' files, '+`du -hd0 #{$cellar} | cut -d"\t" -f1`.strip
+    when 'prune'
+      puts "Pruned #{prune} files"
+    when '--prefix'
+      puts prefix
+    when '--cache'
+      puts File.expand_path('~/Library/Application Support/Homebrew')
+    when '-h', '--help', '--usage', '-?'
+      puts usage
+    when '-v', '--version'
+      puts HOMEBREW_VERSION
+    when 'list'
+      puts `find #{$cellar+shift_formulae}`
+    when 'install'
+      name=shift_formulae
+      beginning = Time.now
+      o=__obj(name)
+      raise "#{o.prefix} already exists!" if o.prefix.exist?
+      o.brew { o.install }
+      ln name
+      puts "#{o.prefix}: "+`find #{o.prefix} -type f | wc -l`.strip+
+                           ' files, '+
+                           `du -hd0 #{o.prefix} | cut -d"\t" -f1`.strip+
+                           ", built in #{Time.now - beginning} seconds"
+    when 'ln'
+      puts "Created #{ln shift_formulae} links"
+    when 'rm'
+      rm shift_formulae
+    when 'info'
+      o=__obj shift_formulae
+      puts "#{o.name} #{o.version}"
+      puts o.homepage
+    else
+      puts usage
+  end
 
+rescue StandardError, Interrupt => e
+  if ARGV.include? '--verbose' or ENV['HOMEBREW_DEBUG']
+    raise
+  elsif e.kind_of? Interrupt
+    puts # seeimgly a newline is typical
+    exit 130
+  elsif e.kind_of? StandardError and not e.kind_of? NameError
+    puts "\033[1;31mError\033[0;0m: #{e}"
+    exit 1
   else
-    puts "usage: #{$0} [prune] [ln path] [install pkg]"
+    raise
+  end
 end
\ No newline at end of file
diff --git a/Cellar/homebrew/brewkit.rb b/Cellar/homebrew/brewkit.rb
index f0daa48c82e08236e12ffb13b112def2581eb835..b19cfcf66b187d0144882f23ede0411c361aa8a9 100644
--- a/Cellar/homebrew/brewkit.rb
+++ b/Cellar/homebrew/brewkit.rb
@@ -2,8 +2,7 @@
 # Licensed as per the GPL version 3
 require 'pathname'
 
-$agent = "Homebrew 0.1 (Ruby; Mac OS X 10.5 Leopard)"
-$cellar = Pathname.new(__FILE__).dirname.parent.realpath
+HOMEBREW_VERSION='0.1'
 
 # optimise all the way to eleven, references:
 # http://en.gentoo-wiki.com/wiki/Safe_Cflags/Intel
@@ -18,9 +17,9 @@ ENV['CC']='gcc-4.2'
 ENV['CXX']='g++-4.2'
 ENV['MAKEFLAGS']='-j2'
 
-unless $cellar.parent.to_s == '/usr/local'
-  ENV['CPPFLAGS']="-I#{$cellar.parent}/include" 
-  ENV['LDFLAGS']="-L#{$cellar.parent}/lib"
+unless $root.to_s == '/usr/local'
+  ENV['CPPFLAGS']='-I'+$root+'include'
+  ENV['LDFLAGS']='-L'+$root+'lib'
 end
 
 
@@ -35,21 +34,59 @@ def appsupport
   return appsupport
 end
 
+
+# make our code neater
+class Pathname
+  def mv dst
+    FileUtils.mv to_s, dst
+  end
+  def cp dst
+    if file?
+      FileUtils.cp to_s, dst
+    else
+      FileUtils.cp_r to_s, dst
+    end
+  end
+end
+
+
 class Formula
   require 'find'
   require 'fileutils'
 
-  # if you reimplement, assign @name, @version, @url and @md5
-  def initialize(url, md5)
-    @name = File.basename $0, '.rb' #original script that the interpreter started
-    @url = url
-    @md5 = md5
+  # fuck knows, ruby is weird
+  def self.url
+    @url
+  end
+  def url
+    self.class.url
+  end
+  def self.md5
+    @md5
+  end
+  def md5
+    self.class.md5
+  end
+  def self.homepage
+    @homepage
+  end
+  def homepage
+    self.class.homepage
+  end  
+  # end ruby is weird section
+
+  def initialize
+    # fuck knows, ruby is weird
+    @url=url if @url.nil?
+    raise "@url.nil?" if @url.nil?
+    @md5=md5 if @md5.nil?
+    # end ruby is weird section
 
     # pls improve this version extraction crap
-    filename=File.basename url
+    filename=File.basename @url
     i=filename.index /[-_]\d/
     unless i.nil?
-      /^((\d+[._])*(\d+-)?\d+)/.match filename[i+1,1000] #1000 because rubysucks
+      /^((\d+[._])*(\d+-)?\d+[abc]?)/.match filename[i+1,1000] #1000 because rubysucks
       @version=$1
       # if there are no dots replace underscores, boost do this, the bastards!
       @version.gsub!('_', '.') unless @version.include? '.'
@@ -59,26 +96,57 @@ class Formula
       @version = $1
     end
   end
+  
+private
+  def maybe_mkpath path
+    path.mkpath unless path.exist?
+    return path
+  end
 
-  #yields a Pathname object for the installation prefix
-  def brew
-    raise "@name.nil?" if @name.nil?
+public  
+  def prefix
+    raise "@name.nil!" if @name.nil?
     raise "@version.nil?" if @version.nil?
+    $cellar+@name+@version
+  end
+  def bin
+    maybe_mkpath prefix+'bin'
+  end
+  def doc
+    maybe_mkpath prefix+'share'+'doc'+name
+  end
+  def man
+    maybe_mkpath prefix+'share'+'man'
+  end
+  def lib
+    maybe_mkpath prefix+'lib'
+  end
+  def include
+    maybe_mkpath prefix+'include'
+  end
 
-    # disabled until the regexp makes sense :P
-    #raise "@name does not validate to our regexp" unless /^\w+$/ =~ @name
+  def name=name
+    raise "Name assigned twice, I'm not letting you do that!" if @name
+    @name=name
+  end
 
-    beginning = Time.now
+protected  
+  def caveats
+    nil
+  end
 
-    prefix=$cellar+@name+@version
-    raise "#{prefix} already exists!" if prefix.exist?
+public
+  #yields a Pathname object for the installation prefix
+  def brew
+    # disabled until the regexp makes sense :P
+    #raise "@name does not validate to our regexp" unless /^\w+$/ =~ @name
 
     ohai "Downloading #{@url}"
 
     Dir.chdir appsupport do
       tgz=Pathname.new(fetch()).realpath
       md5=`md5 -q "#{tgz}"`.strip
-      raise "MD5 mismatch: #{md5}" unless md5 == @md5.downcase
+      raise "MD5 mismatch: #{md5}" unless md5 and md5 == @md5.downcase
 
       # we make an additional subdirectory so know exactly what we are
       # recursively deleting later
@@ -86,26 +154,27 @@ class Formula
       # can't handle being built in a directory with spaces in it :P
       tmp=nil
       begin
-        tmp=`mktemp -dt #{@name}-#{@version}`.strip
+        tmp=`mktemp -dt #{File.basename @url}`.strip
         Dir.chdir tmp do
           Dir.chdir uncompress(tgz) do
-            caveats = yield prefix
+            prefix.mkpath
+            yield self
             if caveats
               ohai "Caveats"
               puts caveats
-              ohai "Summary"
             end
             #TODO copy changelog or CHANGES file to pkg root,
             #TODO maybe README, etc. to versioned root
           end
         end
-      rescue
+      rescue Interrupt, RuntimeError
         if ARGV.include? '--debug'
           # debug mode allows the packager to intercept a failed build and
           # investigate the problems
           puts "Rescued build at: #{tmp}"
           exit! 1
         else
+          FileUtils.rm_rf prefix
           raise
         end
       ensure
@@ -115,27 +184,26 @@ class Formula
 
       ohai 'Finishing up'
 
-      # stay in appsupport in case any odd files gets created etc.
-      `#{$cellar}/homebrew/brew ln #{prefix}` if prefix.exist?
-      
       prefix.find do |path|
         if path==prefix #rubysucks
           next
         elsif path.file?
-          fo=`file -h #{path}`
-          args=nil 
-          args='-SxX' if fo =~ /Mach-O dynamically linked shared library/
-          args='' if fo =~ /Mach-O executable/ #defaults strip everything
-          if args
-            puts "Stripping: #{path}" if ARGV.include? '--verbose'
-            `strip #{args} #{path}`
+          if path.extname == '.la'
+            path.unlink
+          else
+            fo=`file -h #{path}`
+            args=nil 
+            args='-SxX' if fo =~ /Mach-O dynamically linked shared library/
+            args='' if fo =~ /Mach-O executable/ #defaults strip everything
+            if args
+              puts "Stripping: #{path}" if ARGV.include? '--verbose'
+              `strip #{args} #{path}`
+            end
           end
         elsif path.directory? and path!=prefix+'bin' and path!=prefix+'lib'
           Find.prune
         end
       end
-
-      puts "#{prefix}: "+`find #{prefix} -type f | wc -l`.strip+' files, '+`du -hd0 #{prefix} | cut -d"\t" -f1`.strip+", built in #{Time.now - beginning} seconds"
     end
   end
 
@@ -159,8 +227,10 @@ protected
       tgz=File.expand_path File.basename(@url)
     end
 
+    agent="Homebrew #{HOMEBREW_VERSION} (Ruby #{VERSION}; Mac OS X 10.5 Leopard)"
+
     unless File.exists? tgz
-      `curl -#LA "#{$agent}" #{oarg} "#{@url}"`
+      `curl -#LA "#{agent}" #{oarg} "#{@url}"`
       raise "Download failed" unless $? == 0
     else
       puts "File already downloaded and cached"
@@ -178,9 +248,15 @@ protected
     raise "Compression tool failed" if $? != 0
 
     entries=Dir['*']
-    raise "Empty tar!" if entries.nil? or entries.length == 0
-    raise "Too many folders in uncompressed result. You need to reimplement the Recipe.uncompress function." if entries.length > 1
-    return entries.first
+    if entries.nil? or entries.length == 0
+      raise "Empty tarball!" 
+    elsif entries.length == 1
+      # if one dir enter it as that will be where the build is
+      entries.first
+    else
+      # if there's more than one dir, then this is the build directory already
+      Dir.pwd
+    end
   end
   
   def cache?
@@ -193,22 +269,21 @@ private
   end
 end
 
-# you have to reimplement initialize to set the version, for example usage
-# see the ack script
-class UncompressedScriptFormula < Formula
-  def initialize(url)
-    @url=url
-    @name=File.basename url
-  end
+# see ack.rb for an example usage
+class UncompressedScriptFormula <Formula
   def uncompress path
     path.dirname
   end
   def cache?
     false
   end
+  def install
+    FileUtils.cp name, bin
+    (bin+name).chmod 0544
+  end
 end
 
-class GithubGistFormula < Formula
+class GithubGistFormula <Formula
   def initialize(url, md5)
     @url=url
     @name=File.basename url
@@ -225,7 +300,7 @@ class GithubGistFormula < Formula
   end
   
   def uncompress path
-    File.dirname path
+    path.dirname
   end
 end
 
@@ -259,19 +334,6 @@ def system cmd
   end
 end
 
-# force a prettier exception handler unless --verbose or HOMEBREW_DEBUG
-Kernel.at_exit {
-  if $! and not (ARGV.include? '--verbose' or ENV['HOMEBREW_DEBUG'])
-    if $!.kind_of? Interrupt #control-c
-      puts # seeimgly a newline is more typical
-      exit! 130 
-    elsif $!.kind_of? StandardError
-        puts "\033[1;31mError\033[0;0m: #{$!}"
-        exit! 1
-    end
-  end
-}
-
 ########################################################################script
 if $0 == __FILE__
   d=$cellar.parent+'bin'
diff --git a/Cellar/homebrew/unittest.rb b/Cellar/homebrew/unittest.rb
index 8e1e01cb3ac0b3b358dbe42e737b7e4764dffed3..1982faefc12661f99ab5fa7a2db34613fe607cf3 100755
--- a/Cellar/homebrew/unittest.rb
+++ b/Cellar/homebrew/unittest.rb
@@ -1,64 +1,77 @@
 #!/usr/bin/ruby
-cwd=File.dirname(__FILE__)
-$:.unshift cwd #rubysucks
+$:.unshift File.dirname(__FILE__)
+require 'pathname'
+$root=Pathname.new(__FILE__).realpath.dirname.parent.parent
+$cellar=$root+'Cellar'
 require 'brewkit'
 require 'test/unit'
-$cellar=Pathname.new(cwd).parent.realpath
 
-class BeerTasting < Test::Unit::TestCase
+
+class TestFormula <Formula
+  def initialize url, md5
+    @url=url
+    @md5=md5
+    @name='test'
+    super()
+  end
+end
+
+
+class BeerTasting <Test::Unit::TestCase
   def test_version_all_dots
-    r=Formula.new "http://example.com/foo.bar.la.1.14.zip", 'nomd5'
+    r=TestFormula.new "http://example.com/foo.bar.la.1.14.zip", 'nomd5'
     assert_equal '1.14', r.version
   end
 
   def test_version_underscore_separator
-    r=Formula.new "http://example.com/grc_1.1.tar.gz", 'nomd5'
+    r=TestFormula.new "http://example.com/grc_1.1.tar.gz", 'nomd5'
     assert_equal '1.1', r.version
   end
 
   def test_version_underscores_all_the_way
-    r=Formula.new "http://example.com/boost_1_39_0.tar.bz2", 'nomd5'
+    r=TestFormula.new "http://example.com/boost_1_39_0.tar.bz2", 'nomd5'
     assert_equal '1.39.0', r.version
   end
 
   def test_version_internal_dash
-    r=Formula.new "http://example.com/foo-arse-1.1-2.tar.gz", 'nomd5'
+    r=TestFormula.new "http://example.com/foo-arse-1.1-2.tar.gz", 'nomd5'
     assert_equal '1.1-2', r.version
   end
 
   def test_version_single_digit
-    r=Formula.new "http://example.com/foo_bar.45.tar.gz", 'nomd5'
+    r=TestFormula.new "http://example.com/foo_bar.45.tar.gz", 'nomd5'
     assert_equal '45', r.version
   end
 
   def test_noseparator_single_digit
-    r=Formula.new "http://example.com/foo_bar45.tar.gz", 'nomd5'
+    r=TestFormula.new "http://example.com/foo_bar45.tar.gz", 'nomd5'
     assert_equal '45', r.version
   end
 
   def test_version_developer_that_hates_us_format
-    r=Formula.new "http://example.com/foo-bar-la.1.2.3.tar.gz", 'nomd5'
+    r=TestFormula.new "http://example.com/foo-bar-la.1.2.3.tar.gz", 'nomd5'
     assert_equal '1.2.3', r.version
   end
 
   def test_version_regular
-    r=Formula.new "http://example.com/foo_bar-1.21.tar.gz", 'nomd5'
+    r=TestFormula.new "http://example.com/foo_bar-1.21.tar.gz", 'nomd5'
     assert_equal '1.21', r.version
   end
 
+  def test_yet_another_version
+    r=TestFormula.new "http://example.com/mad-0.15.1b.tar.gz", 'nomd5'
+    assert_equal '0.15.1b', r.version
+  end
+
   def test_prefix
     url='http://www.methylblue.com/test-0.1.tar.gz'
     md5='d496ea538a21dc4bb8524a8888baf88c'
     
-    begin #rubysyntaxFAIL
-      Formula.new(url, md5).brew do |prefix|
-        # we test for +/unittest/0.1 because we derive @name from $0
-        assert_equal File.expand_path(prefix), ($cellar+'unittest'+'0.1').to_s
-        assert_kind_of Pathname, prefix
-      end
-    rescue IOError => e
-      # this is not an error, cook will throw as nothing was installed
-      raise unless e.errno == Errno::ENOENT
+    TestFormula.new(url, md5).brew do |f|
+      prefix=f.prefix
+      # we test for +/unittest/0.1 because we derive @name from $0
+      assert_equal File.expand_path(prefix), ($cellar+'test'+'0.1').to_s
+      assert_kind_of Pathname, prefix
     end
   end
 end
\ No newline at end of file
diff --git a/Formula/__template.rb b/Formula/__template.rb
deleted file mode 100644
index 2d7ba24070bd61e5ea9984ac5375196433940188..0000000000000000000000000000000000000000
--- a/Formula/__template.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-$:.unshift "#{File.dirname __FILE__}/../Cellar/homebrew" #rubysucks
-require 'brewkit'
-
-homepage=''
-url=''
-md5='' # leave this blank and brewkit will error out, but show you the md5
-
-Formula.new(url, md5).brew do |prefix|
-  system "./configure --disable-debug --prefix='#{prefix}'"
-  system "make install" # if this fails, split into two steps
-end
\ No newline at end of file
diff --git a/Formula/ack.rb b/Formula/ack.rb
index b27d827ac23c4163b0214128157f185051f92aa2..4bab09c89ee23fc4c7df08daf27b267215538ca0 100644
--- a/Formula/ack.rb
+++ b/Formula/ack.rb
@@ -1,22 +1,10 @@
-$:.unshift "#{File.dirname __FILE__}/../Cellar/homebrew" #rubysucks
 require 'brewkit'
-require 'fileutils'
 
-homepage='http://betterthangrep.com/'
-
-class AckFormula < UncompressedScriptFormula
+class Ack <UncompressedScriptFormula
   def initialize
-    super('http://ack.googlecode.com/svn/tags/1.88/ack')
     @version='1.88'
+    @url="http://ack.googlecode.com/svn/tags/#{@version}/ack"
     @md5='8009a13ab0fc66047bea0ea2ad89419c'
+    @homepage='http://betterthangrep.com/'
   end
-end
-
-ack=AckFormula.new
-ack.brew do |prefix|
-  bin=prefix+'bin'
-  bin.mkpath
-  FileUtils.cp ack.name, bin
-  (bin+ack.name).chmod 0544
-  nil
 end
\ No newline at end of file
diff --git a/Formula/asciidoc.rb b/Formula/asciidoc.rb
new file mode 100644
index 0000000000000000000000000000000000000000..6b53ff83c13c4804620907b83a6f0ddb9f08a189
--- /dev/null
+++ b/Formula/asciidoc.rb
@@ -0,0 +1,12 @@
+require 'brewkit'
+
+class Asciidoc <Formula
+  @url='http://www.methods.co.nz/asciidoc/asciidoc-8.4.4.tar.gz'
+  @md5='579bcd5762b177ee0ddccece8c34724b'
+  @homepage='http://www.methods.co.nz/asciidoc'
+
+  def install
+    system "./configure --disable-debug --prefix='#{prefix}'"
+    system "make install"
+  end
+end
\ No newline at end of file
diff --git a/Formula/boost.rb b/Formula/boost.rb
index 91a875a9b372bf969f2d8552bb7df133360bcb99..2022ef952ca7e6a9514ca56729482b338e73532b 100644
--- a/Formula/boost.rb
+++ b/Formula/boost.rb
@@ -1,17 +1,16 @@
-$:.unshift "#{File.dirname __FILE__}/../Cellar/homebrew" #rubysucks
 require 'brewkit'
 
-homepage='http://www.boost.org'
-url='http://kent.dl.sourceforge.net/sourceforge/boost/boost_1_39_0.tar.bz2'
-md5='a17281fd88c48e0d866e1a12deecbcc0'
+class Boost <Formula
+  @homepage='http://www.boost.org'
+  @url='http://kent.dl.sourceforge.net/sourceforge/boost/boost_1_39_0.tar.bz2'
+  @md5='a17281fd88c48e0d866e1a12deecbcc0'
 
-Formula.new(url, md5).brew do |prefix|
-  lib=prefix+'lib'
-  # we specify libdir too because the script is apparently broken
-  
-  #TODO we can save 6300 links if we just had the intelligence to symlink the
-  # include/boost dir and not more
-  
-  system "./bootstrap.sh --prefix='#{prefix}' --libdir='#{lib}'"
-  system "./bjam --layout=system --prefix='#{prefix}' --libdir='#{lib}' install"
+  def install
+    #TODO we can save 6300 links if we just had the intelligence to symlink
+    #the include/boost dir and not more
+
+    # we specify libdir too because the script is apparently broken
+    system "./bootstrap.sh --prefix='#{prefix}' --libdir='#{lib}'"
+    system "./bjam --layout=system --prefix='#{prefix}' --libdir='#{lib}' install"
+  end
 end
\ No newline at end of file
diff --git a/Formula/cmake.rb b/Formula/cmake.rb
index 2f3a3af1fcc8830ef3a54a4b92ff069cf4a82f07..ee35e3eef5e9afc9118056322501c79889925a69 100644
--- a/Formula/cmake.rb
+++ b/Formula/cmake.rb
@@ -1,19 +1,13 @@
-$:.unshift "#{File.dirname __FILE__}/../Cellar/homebrew" #rubysucks
 require 'brewkit'
-require 'fileutils'
 
-url='http://www.cmake.org/files/v2.6/cmake-2.6.3.tar.gz'
-md5='5ba47a94ce276f326abca1fd72a7e7c6'
+class Cmake <Formula
+  @url='http://www.cmake.org/files/v2.6/cmake-2.6.3.tar.gz'
+  @md5='5ba47a94ce276f326abca1fd72a7e7c6'
 
-Formula.new(url, md5).brew do |prefix|
-  system "./bootstrap --prefix=#{prefix} --system-libs"
-  system "make"
-  system "make install"
-  
-  # the people who develop cmake are just idiots
-  share=prefix+'share'
-  FileUtils.mv prefix+'man', share
-  FileUtils.mv prefix+'doc', share
-  
-  nil
+  def install
+    system "./bootstrap --prefix=#{prefix} --system-libs"
+    system "make install"
+
+    ['man','doc'].each { |d| (prefix+d).mv prefix+'share' }
+  end
 end
\ No newline at end of file
diff --git a/Formula/dmd.rb b/Formula/dmd.rb
index 2ca36a7572c01164190b8f36a1d48f1c0b7f4ccd..9ad5784be3ac9c8fd1f1589f259efe46bc738d6d 100644
--- a/Formula/dmd.rb
+++ b/Formula/dmd.rb
@@ -1,29 +1,42 @@
-$:.unshift "#{File.dirname __FILE__}/../Cellar/homebrew" #rubysucks
 require 'brewkit'
 
-homepage='http://www.digitalmars.com/d/'
-url='http://ftp.digitalmars.com/dmd.1.043.zip'
-md5='6c83b7296cb84090a9ebc11ab0fb94a2'
+class Dmd <Formula
+  @homepage='http://www.digitalmars.com/d/'
+  @url='http://ftp.digitalmars.com/dmd.1.043.zip'
+  @md5='6c83b7296cb84090a9ebc11ab0fb94a2'
 
-Formula.new(url, md5).brew do |prefix|
-  ohai "make"
-  prefix.mkpath
-  FileUtils.cp_r 'osx/bin', prefix
-  FileUtils.cp_r 'osx/lib', prefix
-  FileUtils.cp_r 'man', prefix
-  FileUtils.cp_r 'src', prefix
+  def doc
+    #use d and not dmd, rationale: meh
+    prefix+'share'+'doc'+'d'
+  end
   
-  share=prefix+'share'+'doc'+'d'
-  html=share+'html'
-  samples=share+'examples' #examples is the more typical directory name
-  html.mkpath
-  samples.mkpath
+  def install
+    ohai "install"
+    FileUtils.cp_r 'osx/bin', prefix
+    FileUtils.cp_r 'osx/lib', prefix
+    FileUtils.cp_r 'man/man1', man
+    FileUtils.cp_r 'src', prefix
   
-  FileUtils.cp_r Dir['html/d/*'], html unless ARGV.include? '--no-html'
-  FileUtils.cp_r Dir['samples/d/*'], samples unless ARGV.include? '--no-samples'
-
-  # zip files suck
-  Dir.chdir(prefix+'bin') { `chmod u+x dmd dumpobj obj2asm` }
+    #lol
+    man5=man+'man5'
+    man5.mkpath
+    (man+'man1'+'dmd.conf.5').mv man5
+    #lol ends
+  
+    html=doc+'html'
+    samples=doc+'examples' #examples is the more typical directory name
+    html.mkpath
+    samples.mkpath
+  
+    FileUtils.cp_r Dir['html/d/*'], html unless ARGV.include? '--no-html'
+    FileUtils.cp_r Dir['samples/d/*'], samples unless ARGV.include? '--no-samples'
 
-  nil
+    # zip files suck TODO FileUtils.chmod
+    Dir.chdir(bin) { `chmod u+x dmd dumpobj obj2asm` }
+    
+    (prefix+'bin'+'dmd.conf').open('w') do |f|
+      f.puts "[Environment]"
+      f.puts "DFLAGS=-I#{prefix}/src/phobos -L-L#{prefix}/lib"
+    end
+  end
 end
\ No newline at end of file
diff --git a/Formula/fftw.rb b/Formula/fftw.rb
index 2220270f2843655ba9f26ae0bdbaa714cdc9e222..e79002fc4b875a8bf7b8568d030ad64083b42eaf 100644
--- a/Formula/fftw.rb
+++ b/Formula/fftw.rb
@@ -1,17 +1,21 @@
-$:.unshift "#{File.dirname __FILE__}/../Cellar/homebrew" #rubysucks
 require 'brewkit'
 
-homepage='http://www.fftw.org'
-url='http://www.fftw.org/fftw-3.2.1.tar.gz'
-md5='712d3f33625a0a76f5758648d4b925f7'
+class Fftw <Formula
+  @homepage='http://www.fftw.org'
+  @url='http://www.fftw.org/fftw-3.2.1.tar.gz'
+  @md5='712d3f33625a0a76f5758648d4b925f7'
 
-Formula.new(url, md5).brew do |prefix|
-  configure=<<-EOS
-  ./configure --enable-shared --disable-debug --prefix='#{prefix}'
-              --enable-threads --enable-single --enable-sse
-              --disable-dependency-tracking
-              --disable-fortran
-              EOS
-  system configure.gsub("\n", ' ').strip.squeeze(' ')
-  system "make install"
+  def install
+    configure=<<-EOS
+    ./configure --enable-shared --disable-debug --prefix='#{prefix}'
+                --enable-threads --enable-single --enable-sse
+                --disable-dependency-tracking
+                --disable-fortran
+                EOS
+    system configure.gsub("\n", ' ').strip.squeeze(' ')
+    system "make install"
+    
+    #wtf file?
+    (prefix+'share'+'info'+'dir').unlink
+  end
 end
\ No newline at end of file
diff --git a/Formula/git.rb b/Formula/git.rb
index e0ec8d34d611c064eac2b0db5354737f5624d56d..0f0620f407ebea2b81efe0458a9e0843c9b697fd 100644
--- a/Formula/git.rb
+++ b/Formula/git.rb
@@ -1,12 +1,20 @@
-$:.unshift "#{File.dirname __FILE__}/../Cellar/homebrew" #rubysucks
 require 'brewkit'
 
-homepage='http://git-scm.com'
-url='http://kernel.org/pub/software/scm/git/git-1.6.3.1.tar.bz2'
-md5='c1f4aab741359c29f0fbf28563ac7387'
+class GitManuals <Formula
+  @url='http://kernel.org/pub/software/scm/git/git-manpages-1.6.3.1.tar.bz2'
+  @md5='971d573e8f261feb83290a59728c2b33'
+end
 
-Formula.new(url, md5).brew do |prefix|
-  system "./configure --disable-debug --prefix='#{prefix}'"
-  system "make"
-  system "make install"
+class Git <Formula
+  @url='http://kernel.org/pub/software/scm/git/git-1.6.3.1.tar.bz2'
+  @md5='c1f4aab741359c29f0fbf28563ac7387'
+  @homepage='http://git-scm.com'
+
+  def install
+    system "./configure --prefix='#{prefix}' --disable-debug"
+    system "make install"
+
+    # the manuals come separately, well sort of, it's easier this way though
+    GitManuals.new.brew { FileUtils.mv Dir['*'], man }
+  end
 end
\ No newline at end of file
diff --git a/Formula/grc.rb b/Formula/grc.rb
index c80cabf9620c4953763b7377ca487a20acdb409b..7f6db90b0d2640af26d57280148e41b98a8dd047 100644
--- a/Formula/grc.rb
+++ b/Formula/grc.rb
@@ -1,6 +1,4 @@
-$:.unshift "#{File.dirname __FILE__}/../Cellar/homebrew" #rubysucks
 require 'brewkit'
-require 'fileutils'
 
 def profile_string
   <<-sput
@@ -33,36 +31,40 @@ case ARGV[0]
 end
 
 ######################################################################### cook
-homepage='http://korpus.juls.savba.sk/~garabik/software/grc.html'
-url='http://korpus.juls.savba.sk/~garabik/software/grc/grc_1.1.tar.gz'
-md5='eeb612aba2fff14cbaf1f3bec7e1eb60'
+class Grc <Formula
+  @homepage='http://korpus.juls.savba.sk/~garabik/software/grc.html'
+  @url='http://korpus.juls.savba.sk/~garabik/software/grc/grc_1.1.tar.gz'
+  @md5='eeb612aba2fff14cbaf1f3bec7e1eb60'
 
-Formula.new(url, md5).brew do |prefix|
-  ohai "make"  
-  #TODO we should deprefixify since it's python and thus possible
-  inreplace 'grc', '/etc', prefix+'etc'
-  inreplace 'grc.1', '/etc', prefix+'etc'
-  inreplace 'grcat', '/usr/local', prefix
-  inreplace 'grcat.1', '/usr/local', prefix
+  def install
+    ohai "make"  
+    #TODO we should deprefixify since it's python and thus possible
+    inreplace 'grc', '/etc', prefix+'etc'
+    inreplace 'grc.1', '/etc', prefix+'etc'
+    inreplace 'grcat', '/usr/local', prefix
+    inreplace 'grcat.1', '/usr/local', prefix
 
-  FileUtils.mkpath prefix
-  Dir.chdir prefix do
-    FileUtils.mkpath 'bin'
-    FileUtils.mkpath 'share/grc'
-    FileUtils.mkpath 'share/man/man1'
-    FileUtils.mkpath 'etc'
-  end
-
-  `cp -fv grc grcat #{prefix}/bin`
-  `cp -fv conf.* #{prefix}/share/grc`
-  `cp -fv grc.conf #{prefix}/etc`
-  `cp -fv grc.1 grcat.1 #{prefix}/share/man/man1`
+    FileUtils.mkpath prefix
+    Dir.chdir prefix do
+      FileUtils.mkpath 'bin'
+      FileUtils.mkpath 'share/grc'
+      FileUtils.mkpath 'share/man/man1'
+      FileUtils.mkpath 'etc'
+    end
 
-  <<-nruter
-grc won't work as is. One option is to add some aliases to your ~/.profile 
-file. Homebrew can do that for you, just execute this command:
+    `cp -fv grc grcat #{prefix}/bin`
+    `cp -fv conf.* #{prefix}/share/grc`
+    `cp -fv grc.conf #{prefix}/etc`
+    `cp -fv grc.1 grcat.1 #{prefix}/share/man/man1`
+  end
+  
+  def caveats
+    <<-EOS
+    grc won't work as is. One option is to add some aliases to your ~/.profile 
+    file. Homebrew can do that for you, just execute this command:
 
-    ruby #{$0} --profile >> ~/.profile
+        ruby #{$0} --profile >> ~/.profile
 
-nruter
-end
+    EOS
+  end
+end
\ No newline at end of file
diff --git a/Formula/lame.rb b/Formula/lame.rb
index 8bbf7b3d8f794693308ba2d2796cbe32125e671a..2c248285c5157cf5979d1a4be1dcd3188dd292a7 100644
--- a/Formula/lame.rb
+++ b/Formula/lame.rb
@@ -1,11 +1,12 @@
-$:.unshift "#{File.dirname __FILE__}/../Cellar/homebrew" #rubysucks
 require 'brewkit'
 
-homepage='http://lame.sourceforge.net/'
-url='http://kent.dl.sourceforge.net/sourceforge/lame/lame-398-2.tar.gz'
-md5='719dae0ee675d0c16e0e89952930ed35'
+class Lame <Formula
+  @homepage='http://lame.sourceforge.net/'
+  @url='http://kent.dl.sourceforge.net/sourceforge/lame/lame-398-2.tar.gz'
+  @md5='719dae0ee675d0c16e0e89952930ed35'
 
-Formula.new(url, md5).brew do |prefix|
-  system "./configure --disable-debug --prefix='#{prefix}' --enable-nasm"
-  system "make install" # if this fails, split into two steps
+  def install
+    system "./configure --disable-debug --prefix='#{prefix}' --enable-nasm"
+    system "make install"
+  end
 end
\ No newline at end of file
diff --git a/Formula/liblastfm.rb b/Formula/liblastfm.rb
index fe0d67ba3c51fc2995bb244d58c6e5879e76089c..5d1999172b8f7983a72b9dcd00e225f8fb6cba31 100644
--- a/Formula/liblastfm.rb
+++ b/Formula/liblastfm.rb
@@ -1,14 +1,19 @@
-$:.unshift "#{File.dirname __FILE__}/../Cellar/homebrew" #rubysucks
 require 'brewkit'
 
-homepage='http://github.com/mxcl/liblastfm/'
-url='http://github.com/mxcl/liblastfm/tarball/0.3.0'
-md5='b348917689b90f3f40125d0968f0b643'
+class Liblastfm <Formula
+  @homepage='http://github.com/mxcl/liblastfm/'
+  @url='http://github.com/mxcl/liblastfm/tarball/0.3.0'
+  @md5='08e90275ccd06476426a5002d1dad762'
 
-external_deps=['qmake']
+  def deps
+    dep_test_bin 'qmake' or 'qt'
+    dep_test_lib 'fftw3f' or 'fftw'
+    dep_test_lib 'samplerate' or 'libsamplerate'
+  end
 
-Formula.new(url, md5).brew do |prefix|
-  system "./configure --release --prefix '#{prefix}'"
-  system "make"
-  system "make install"
+  def install
+    system "./configure --release --prefix '#{prefix}'"
+    system "make"
+    system "make install"
+  end
 end
\ No newline at end of file
diff --git a/Formula/libogg.rb b/Formula/libogg.rb
index 28a1d84d1c6919dd606ec6e016fd2f8d19382484..178835342d34a773aba9090faa58bf0ea5ea669e 100644
--- a/Formula/libogg.rb
+++ b/Formula/libogg.rb
@@ -1,11 +1,12 @@
-$:.unshift "#{File.dirname __FILE__}/../Cellar/homebrew" #rubysucks
 require 'brewkit'
 
-homepage='http://www.xiph.org/ogg/'
-url='http://downloads.xiph.org/releases/ogg/libogg-1.1.3.tar.gz'
-md5='eaf7dc6ebbff30975de7527a80831585'
+class Libogg <Formula
+  @homepage='http://www.xiph.org/ogg/'
+  @url='http://downloads.xiph.org/releases/ogg/libogg-1.1.3.tar.gz'
+  @md5='eaf7dc6ebbff30975de7527a80831585'
 
-Formula.new(url, md5).brew do |prefix|
-  system "./configure --disable-debug --prefix='#{prefix}'"
-  system "make install"
+  def install
+    system "./configure --disable-debug --prefix='#{prefix}'"
+    system "make install"
+  end
 end
\ No newline at end of file
diff --git a/Formula/libsamplerate.rb b/Formula/libsamplerate.rb
index 7c9a9c5ec87d1e47b87135f05de889ceea7921f3..d6dedc6c7518ad2912b128f5dfb9918845dc67d3 100644
--- a/Formula/libsamplerate.rb
+++ b/Formula/libsamplerate.rb
@@ -1,11 +1,12 @@
-$:.unshift "#{File.dirname __FILE__}/../Cellar/homebrew" #rubysucks
 require 'brewkit'
 
-homepage='http://www.mega-nerd.com/SRC'
-url='http://www.mega-nerd.com/SRC/libsamplerate-0.1.7.tar.gz'
-md5='ad093e60ec44f0a60de8e29983ddbc0f'
+class Libsamplerate <Formula
+  @homepage='http://www.mega-nerd.com/SRC'
+  @url='http://www.mega-nerd.com/SRC/libsamplerate-0.1.7.tar.gz'
+  @md5='ad093e60ec44f0a60de8e29983ddbc0f'
 
-Formula.new(url, md5).brew do |prefix|
-  system "./configure --disable-debug --prefix='#{prefix}'"
-  system "make install"
+  def install
+    system "./configure --disable-debug --prefix='#{prefix}'"
+    system "make install"
+  end
 end
\ No newline at end of file
diff --git a/Formula/mad.rb b/Formula/mad.rb
index ba11fe33c6726cc21c9b436d637b101856b0e3c7..0bbcab8f985b3a6c58e0481f91f821e0ee655cf0 100644
--- a/Formula/mad.rb
+++ b/Formula/mad.rb
@@ -1,12 +1,12 @@
-$:.unshift "#{File.dirname __FILE__}/../Cellar/homebrew" #rubysucks
 require 'brewkit'
 
-homepage='http://www.underbit.com/products/mad/'
-url='http://kent.dl.sourceforge.net/sourceforge/mad/libmad-0.15.1b.tar.gz'
-md5='1be543bc30c56fb6bea1d7bf6a64e66c'
+class Mad <Formula
+  @homepage='http://www.underbit.com/products/mad/'
+  @url='http://kent.dl.sourceforge.net/sourceforge/mad/libmad-0.15.1b.tar.gz'
+  @md5='1be543bc30c56fb6bea1d7bf6a64e66c'
 
-Formula.new(url, md5).brew do |prefix|
-  system "./configure --disable-debugging --enable-fpm=intel --prefix='#{prefix}'"
-  system "make"
-  system "make install"
+  def install
+    system "./configure --disable-debugging --enable-fpm=intel --prefix='#{prefix}'"
+    system "make install"
+  end
 end
\ No newline at end of file
diff --git a/Formula/pkg-config.rb b/Formula/pkg-config.rb
index 18c321090370b7f3efda7ba8842e218a33deb69c..9254c5a657633de51cbbfd5b04cde12df50f95f8 100644
--- a/Formula/pkg-config.rb
+++ b/Formula/pkg-config.rb
@@ -1,15 +1,14 @@
-require 'pathname'
-$root=Pathname.new(__FILE__).dirname.parent
-$:.unshift "#{$root}/Cellar/homebrew" #rubysucks
 require 'brewkit'
 
-homepage='http://pkgconfig.freedesktop.org'
-url='http://pkgconfig.freedesktop.org/releases/pkg-config-0.23.tar.gz'
-md5='d922a88782b64441d06547632fd85744'
+class PkgConfig <Formula
+  @homepage='http://pkgconfig.freedesktop.org'
+  @url='http://pkgconfig.freedesktop.org/releases/pkg-config-0.23.tar.gz'
+  @md5='d922a88782b64441d06547632fd85744'
 
-#TODO depend on our glib? --with-installed-glib
+  #TODO depend on our glib? --with-installed-glib
 
-Formula.new(url, md5).brew do |prefix|
-  system "./configure --with-pc-path=/usr/lib/pkgconfig:/usr/local/lib/pkgconfig:#{$root}/lib/pkgconfig --disable-debug --prefix='#{prefix}'"
-  system "make install"
+  def install
+    system "./configure --with-pc-path=/usr/lib/pkgconfig:/usr/local/lib/pkgconfig:#{$root}/lib/pkgconfig --disable-debug --prefix='#{prefix}'"
+    system "make install"
+  end
 end
\ No newline at end of file
diff --git a/Formula/pngcrush.rb b/Formula/pngcrush.rb
index 0a60781f31bf027d04d7ad154ceb808cb814ff09..00a889403c77335ab620ea63d9108652fc89f1a2 100644
--- a/Formula/pngcrush.rb
+++ b/Formula/pngcrush.rb
@@ -1,13 +1,12 @@
-$:.unshift "#{File.dirname __FILE__}/../Cellar/homebrew" #rubysucks
 require 'brewkit'
 
-homepage='http://pmt.sourceforge.net/pngcrush/'
-url='http://kent.dl.sourceforge.net/sourceforge/pmt/pngcrush-1.6.17.tar.bz2'
-md5='8ba31ae9b1b14e7648df320fd1ed27c7'
+class Pngcrush <Formula
+  @homepage='http://pmt.sourceforge.net/pngcrush/'
+  @url='http://kent.dl.sourceforge.net/sourceforge/pmt/pngcrush-1.6.17.tar.bz2'
+  @md5='8ba31ae9b1b14e7648df320fd1ed27c7'
 
-Formula.new(url, md5).brew do |prefix|
-  system "make"
-  bin=prefix+'bin'
-  bin.mkpath
-  FileUtils.cp 'pngcrush', bin
+  def install
+    system "make"
+    FileUtils.cp 'pngcrush', bin
+  end
 end
\ No newline at end of file
diff --git a/Formula/qt.rb b/Formula/qt.rb
new file mode 100644
index 0000000000000000000000000000000000000000..9ce82d6003d52261c89d9ec20ba472fd8c5ae11d
--- /dev/null
+++ b/Formula/qt.rb
@@ -0,0 +1,43 @@
+require 'brewkit'
+
+class Qt <Formula
+  @url='http://get.qtsoftware.com/qt/source/qt-mac-opensource-src-4.5.1.tar.gz'
+  @md5='9fc0e96197df6db48a0628ac4d63e0dd'
+  @homepage='http://www.qtsoftware.com'
+
+  def install
+    if version == '4.5.1'
+      # Reported 6 months ago (at 4.5.0-rc1), still not fixed in the this release! :(
+      makefiles=['plugins/sqldrivers/sqlite/sqlite.pro', '3rdparty/webkit/WebCore/WebCore.pro']
+      makefiles.each { |makefile| `echo 'LIBS += -lsqlite3' >> src/#{makefile}` }
+    end
+
+    configure=<<-EOS
+      ./configure -prefix '#{prefix}'
+               -system-sqlite -system-libpng -system-zlib
+               -nomake demos -nomake examples -no-qt3support
+               -release -cocoa -arch x86
+               -confirm-license -opensource
+               -I /usr/X11R6/include -L /usr/X11R6/lib
+               -fast
+               EOS
+
+    system configure.gsub("\n", ' ').strip.squeeze(' ')
+    system "make install"
+    
+    # fuck weird prl files
+    `find #{lib} -name \*.prl -delete`
+    # fuck crazy disk usage
+    `rm -r #{prefix+'doc'+'html'} #{prefix+'doc'+'src'}`
+    # wtf are these anyway?
+    `rm -r #{bin}/Assistant_adp.app #{bin}/pixeltool.app #{bin}/qhelpconverter.app`
+    # we specified no debug already! :P
+    `rm #{lib}/libQtUiTools_debug.a`
+    # meh
+    `rm #{prefix}/q3porting.xml`
+  end
+
+  def caveats
+    "We agreed to the Qt opensource license for you.\nIf this is unacceptable you should uninstall :P"
+  end
+end
\ No newline at end of file
diff --git a/Formula/taglib.rb b/Formula/taglib.rb
index 48e76b5d778491901a51cbab8bcded7c8d98f7dc..2811decec2821fb822503e362519acde1d3e80ca 100644
--- a/Formula/taglib.rb
+++ b/Formula/taglib.rb
@@ -1,12 +1,12 @@
-$:.unshift "#{File.dirname __FILE__}/../Cellar/homebrew" #rubysucks
 require 'brewkit'
 
-homepage='http://developer.kde.org/~wheeler/taglib.html'
-url='http://developer.kde.org/~wheeler/files/src/taglib-1.5.tar.gz'
-md5='7b557dde7425c6deb7bbedd65b4f2717'
+class Taglib <Formula
+  @url='http://developer.kde.org/~wheeler/files/src/taglib-1.5.tar.gz'
+  @md5='7b557dde7425c6deb7bbedd65b4f2717'
+  @homepage='http://developer.kde.org/~wheeler/taglib.html'
 
-Formula.new(url, md5).brew do |prefix|
-  system "./configure --disable-debug --prefix='#{prefix}'"
-  system "make"
-  system "make install"
+  def install
+    system "./configure --disable-debug --prefix='#{prefix}'"
+    system "make install"
+  end
 end
\ No newline at end of file
diff --git a/Formula/term.rb b/Formula/term.rb
index fb8149a3cf1eca6ef14f72baf29240b78708d5d8..427d3607a546f9a85917a6dc9ea5c47140dcea61 100644
--- a/Formula/term.rb
+++ b/Formula/term.rb
@@ -1,21 +1,10 @@
-$:.unshift "#{File.dirname __FILE__}/../Cellar/homebrew" #rubysucks
 require 'brewkit'
-require 'fileutils'
 
-homepage='http://gist.github.com/116587'
-
-class TermFormula < UncompressedScriptFormula
+class Term <UncompressedScriptFormula
   def initialize
-    super('http://github.com/liyanage/macosx-shell-scripts/raw/e29f7eaa1eb13d78056dec85dc517626ab1d93e3/term')
+    @url='http://github.com/liyanage/macosx-shell-scripts/raw/e29f7eaa1eb13d78056dec85dc517626ab1d93e3/term'
     @md5='1bbf4509a50224b27ac8c20d3fe8682e'
     @version='2.1'
+    @homepage='http://gist.github.com/116587'
   end
-end
-
-term=TermFormula.new
-term.brew do |prefix|
-  bin=(prefix+'bin')
-  bin.mkpath
-  FileUtils.cp term.name, bin
-  nil
 end
\ No newline at end of file
diff --git a/Formula/wget.rb b/Formula/wget.rb
index 0f5a02362720f87667892d873c28a7363f885853..2ba5722e02cd39797f2217265223995c7af02781 100644
--- a/Formula/wget.rb
+++ b/Formula/wget.rb
@@ -1,12 +1,13 @@
-$:.unshift "#{File.dirname __FILE__}/../Cellar/homebrew" #rubysucks
 require 'brewkit'
 
-homepage='http://www.gnu.org/software/wget/'
-url='http://ftp.gnu.org/gnu/wget/wget-1.11.4.tar.bz2'
-md5='f5076a8c2ec2b7f334cb6e3059820f9c'
+class Wget <Formula
+  @homepage='http://www.gnu.org/software/wget/'
+  @url='http://ftp.gnu.org/gnu/wget/wget-1.11.4.tar.bz2'
+  @md5='f5076a8c2ec2b7f334cb6e3059820f9c'
 
-Formula.new(url, md5).brew do |prefix|
-  system "./configure --disable-debug --prefix='#{prefix}'"
-  system "make"
-  system "make install"
+  def install
+    system "./configure --disable-debug --prefix='#{prefix}'"
+    system "make"
+    system "make install"
+  end
 end
\ No newline at end of file
diff --git a/Formula/xmlrpc-c.rb b/Formula/xmlrpc-c.rb
index 2d0fba3b71d85134c44538468142c9d06dafebbf..27d6f3a1ed747f6071a8c36f6ae15777011275ec 100644
--- a/Formula/xmlrpc-c.rb
+++ b/Formula/xmlrpc-c.rb
@@ -1,16 +1,16 @@
-$:.unshift "#{File.dirname __FILE__}/../Cellar/homebrew" #rubysucks
 require 'brewkit'
 
-homepage='http://xmlrpc-c.sourceforge.net/'
-url='http://kent.dl.sourceforge.net/sourceforge/xmlrpc-c/xmlrpc-c-1.06.33.tgz'
-md5='7dda4d8c5d26ae877d3809e428ce7962'
+class XmlrpcC <Formula
+  @url='http://kent.dl.sourceforge.net/sourceforge/xmlrpc-c/xmlrpc-c-1.06.33.tgz'
+  @md5='7dda4d8c5d26ae877d3809e428ce7962'
+  @homepage='http://xmlrpc-c.sourceforge.net/'
 
-Formula.new(url, md5).brew do |prefix|
-  ENV['MAKEFLAGS']='' #parallel build doesn't work
-  # choosing --enable-libxml2-backend to lose some weight and not statically
-  # link in expat
-  #NOTE seemingly it isn't possible to build dylibs with this thing
-  system "./configure --disable-debug --enable-libxml2-backend --prefix='#{prefix}'"
-  system "make"
-  system "make install"
+  def install
+    ENV['MAKEFLAGS']='' #parallel build doesn't work
+    # choosing --enable-libxml2-backend to lose some weight and not statically
+    # link in expat
+    #NOTE seemingly it isn't possible to build dylibs with this thing
+    system "./configure --disable-debug --enable-libxml2-backend --prefix='#{prefix}'"
+    system "make install"
+  end
 end
\ No newline at end of file
diff --git a/Formula/yajl.rb b/Formula/yajl.rb
index a4784d71578b9330ae352645fee1865dcac4f6f9..f72432dda00f1d1ca8a4d745a7ed78263fe4cd70 100644
--- a/Formula/yajl.rb
+++ b/Formula/yajl.rb
@@ -1,16 +1,21 @@
-$:.unshift "#{File.dirname __FILE__}/../Cellar/homebrew" #rubysucks
 require 'brewkit'
 
-homepage='http://lloyd.github.com/yajl/'
-url='http://github.com/lloyd/yajl/tarball/1.0.5'
-md5='f4a3cbc764c43231ed1aedc54438b69b'
+class Yajl <Formula
+  @homepage='http://lloyd.github.com/yajl/'
+  @url='http://github.com/lloyd/yajl/tarball/1.0.5'
+  @md5='f4a3cbc764c43231ed1aedc54438b69b'
 
-deps=['cmake']
+  def deps
+    dep_test_bin 'cmake'
+  end
 
-Formula.new(url, md5).brew do |prefix|
-  
-  inreplace 'configure', 'cmake \.\.', "cmake -DCMAKE_INSTALL_PREFIX='#{prefix}' \.\."
-  
-  system "./configure --prefix '#{prefix}'"
-  system "make install"
+  def install
+    ENV['MAKEFLAGS']='' # can't do parallel builds
+
+    # I have pushed this fix upstream
+    inreplace 'configure', 'cmake \.\.', "cmake -DCMAKE_INSTALL_PREFIX='#{prefix}' \.\." if @version == "1.0.5"
+
+    system "./configure --prefix '#{prefix}'"
+    system "make install"
+  end
 end
\ No newline at end of file
diff --git a/README b/README
index de4f0e93804000b7dd13115b3093f85d84d2ff5f..8687df8d57c4a0e7f2357bde131a3a61480ae55b 100644
--- a/README
+++ b/README
@@ -128,12 +128,15 @@ Congratulations, you have contributed to an open source project!
 
 Contributing
 ============
-New Formulas
+New Formulae
 ------------
 Relative to every other stupid packaging system ever, this is trivial. Just
 fork it at: http://github.com/mxcl/homebrew and create a new recipe. Then ask
 me to pull. Using git made all this so much easier.
 
+HomeBrew is not an Autarky so any dependencies outside of OS X that a package
+may require may be installed separately. We have functions to help with that.
+
 Code
 ----
 Yes please! Fork and improve :)