<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -5,4 +5,5 @@ pkg
 *~
 tmp
 config.yml
-rdoc
\ No newline at end of file
+rdoc
+spec/tmp
\ No newline at end of file</diff>
      <filename>.gitignore</filename>
    </modified>
    <modified>
      <diff>@@ -1,5 +1,6 @@
 --- 
 :filename: config.example.yml
+:soup: soup
 :secret: a6bc097eff86cabd92ee72ba4687c3f057b7556deaa3e4a6b284460871056b87ba3e91548c37dcc44fbc10241cee5b386556e6bcc2946fd9b609dc3bc1b24488
 :credentials: 
   admin: 5f4dcc3b5aa765d61d8327deb882cf99</diff>
      <filename>config.example.yml</filename>
    </modified>
    <modified>
      <diff>@@ -1,5 +1,5 @@
 $:.unshift File.join(File.dirname(__FILE__), *%w[lib])
-require 'vanilla/app'
+require 'vanilla'
 
 app = Vanilla::App.new(ENV['VANILLA_CONFIG'])
 use Rack::Session::Cookie, :key =&gt; 'vanilla.session',</diff>
      <filename>config.ru</filename>
    </modified>
    <modified>
      <diff>@@ -12,20 +12,15 @@ namespace :vanilla do
     FileUtils.rm &quot;soup.db&quot; if File.exist?(&quot;soup.db&quot;)
   end
 
-  task :prepare do
-    Soup.prepare
-  end
-
-  task :load_snips =&gt; :prepare do  
-    Dynasnip.persist_all!(overwrite=true)
+  task :load_snips do
+    app = Vanilla::App.new(ENV['VANILLA_CONFIG'])
+    Dynasnip.all.each { |ds| app.soup &lt;&lt; ds.snip_attributes }
   
     Dir[File.join(File.dirname(__FILE__), '..', 'vanilla', 'snips', '*.rb')].each do |f|
       load f
     end  
   
-    load File.join(File.dirname(__FILE__), *%w[.. vanilla test_snips.rb])
-  
-    puts &quot;The soup is simmering. Loaded #{Soup.tuple_class.count} tuples&quot;
+    puts &quot;The soup is simmering.&quot;
   end
 
   desc 'Resets the soup to contain the base snips only. Dangerous!'
@@ -33,19 +28,20 @@ namespace :vanilla do
 
   namespace :upgrade do
     desc 'Upgrade the dynasnips'
-    task :dynasnips =&gt; :prepare do
+    task :dynasnips do
+      app = Vanilla::App.new(ENV['VANILLA_CONFIG'])
       Dynasnip.all.each do |dynasnip|
         print &quot;Upgrading #{dynasnip.snip_name}... &quot;
         # TODO: our confused Soup interface might return an array.
-        snip = Soup[dynasnip.snip_name]
+        snip = app.soup[dynasnip.snip_name]
         if snip.empty? || snip.nil?
           # it's a new dyna
-          Soup &lt;&lt; dynasnip.snip_attributes
+          app.soup &lt;&lt; dynasnip.snip_attributes
           puts &quot;(new)&quot;
         elsif snip.created_at == snip.updated_at
           # it's not been changed, let's upgrade
           snip.destroy
-          Soup &lt;&lt; dynasnip.snip_attributes
+          app.soup &lt;&lt; dynasnip.snip_attributes
           puts &quot;(unedited)&quot;
         else
           # the dyna exists and has been changed</diff>
      <filename>lib/tasks/vanilla.rake</filename>
    </modified>
    <modified>
      <diff>@@ -1,15 +1,8 @@
-require 'vanilla/snip_handling'
-
-module Vanilla
-  include SnipHandling
-end
+require 'vanilla/app'
 
 # Load all the other renderer subclasses
 Dir[File.join(File.dirname(__FILE__), 'vanilla', 'renderers', '*.rb')].each { |f| require f }  
 
-# Load the routing information
-require 'vanilla/routes'
-
 # Load all the base dynasnip classes
 Dir[File.join(File.dirname(__FILE__), 'vanilla', 'dynasnips', '*.rb')].each do |dynasnip|
   require dynasnip</diff>
      <filename>lib/vanilla.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,19 +1,29 @@
-require 'vanilla'
 require 'vanilla/request'
+require 'vanilla/routes'
+
+# Require the base set of renderers
+require 'vanilla/renderers/base'
+require 'vanilla/renderers/raw'
+require 'vanilla/renderers/erb'
+
+# Require the data store
+require 'soup'
+
 
 module Vanilla
   class App
+    include Routes
     
-    attr_reader :request, :response, :config
+    attr_reader :request, :response, :config, :soup
     
     def initialize(config_file=nil)
       prepare_configuration(config_file)
-      Soup.prepare
+      @soup = Soup.new(config[:soup])
     end
     
     # Returns a Rack-appropriate 3-element array (via Rack::Response#finish)
     def call(env)
-      @request = Vanilla::Request.new(env)
+      @request = Vanilla::Request.new(env, self)
       @response = Rack::Response.new
 
       begin
@@ -32,7 +42,7 @@ module Vanilla
     def formatted_render(snip, part=nil, format=nil)
       case format
       when 'html', nil
-        Renderers::Erb.new(self).render(Vanilla.snip('system'), :main_template)
+        Renderers::Erb.new(self).render(soup['system'], :main_template)
       when 'raw', 'css', 'js'
         Renderers::Raw.new(self).render(snip, part || :content)
       when 'text', 'atom', 'xml'
@@ -73,6 +83,10 @@ module Vanilla
       &quot;[snip '#{snip_name}' cannot be found]&quot;
     end
     
+    def snip(attributes)
+      Snip.new(attributes, soup)
+    end
+    
     private
     
     def prepare_configuration(config_file)</diff>
      <filename>lib/vanilla/app.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,4 @@
 require 'vanilla'
-Soup.prepare
+app = Vanilla::App.new(ENV['VANILLA_CONFIG'])
+soup = app.soup
 puts &quot;The Soup is simmering.&quot;
\ No newline at end of file</diff>
      <filename>lib/vanilla/console.rb</filename>
    </modified>
    <modified>
      <diff>@@ -29,50 +29,16 @@ class Dynasnip &lt; Vanilla::Renderers::Base
     attribute :usage, escape_curly_braces(str).strip
   end
   
-  def self.persist_all!(overwrite=false)
-    all.each do |dynasnip|
-      dynasnip.persist!(overwrite)
-    end
-  end
-  
-  def self.build_snip
-    Snip.new(snip_attributes)
-  end
-  
   def self.snip_attributes
     full_snip_attributes = {:name =&gt; snip_name, :content =&gt; self.name, :render_as =&gt; &quot;Ruby&quot;}
     @attributes ? full_snip_attributes.merge!(@attributes) : full_snip_attributes
   end
   
-  def self.persist!(overwrite=false)
-    if overwrite
-      snip = Soup[snip_name]
-      if snip
-        if snip.is_a?(Array)
-          snip.each { |s| s.destroy }
-        else
-          snip.destroy
-        end
-      end
-    end
-    snip = Soup[snip_name]
-    snip = snip[0] if snip.is_a?(Array)    
-    if snip
-      snip_attributes.each do |name, value|
-        snip.set_value(name, value)
-      end
-    else
-      snip = build_snip
-    end
-    snip.save
-    snip
-  end
-  
   attr_accessor :enclosing_snip
   
   def method_missing(method, *args)
-    if snip = Vanilla.snip(snip_name)
-      snip.get_value(method)
+    if snip
+      snip.__send__(method)
     elsif part = self.class.attribute(method)
       part
     else
@@ -90,7 +56,7 @@ class Dynasnip &lt; Vanilla::Renderers::Base
   end
   
   def snip
-    Snip[snip_name]
+    app.soup[snip_name]
   end
   
   def show_usage</diff>
      <filename>lib/vanilla/dynasnip.rb</filename>
    </modified>
    <modified>
      <diff>@@ -16,20 +16,20 @@ class Comments &lt; Dynasnip
   def get(snip_name=nil, disable_new_comments=false)
     snip_name = snip_name || app.request.params[:snip]
     return usage if self.class.snip_name == snip_name
-    comments = Soup.sieve(:commenting_on =&gt; snip_name)
+    comments = app.soup.sieve(:commenting_on =&gt; snip_name)
     comments_html = if app.request.snip_name == snip_name
       rendered_comments = render_comments(comments)
       rendered_comments += comment_form.gsub('SNIP_NAME', snip_name) unless disable_new_comments
       rendered_comments
     else
-     %{&lt;a href=&quot;#{Vanilla::Routes.url_to(snip_name)}&quot;&gt;#{comments.length} comments for #{snip_name}&lt;/a&gt;}
+     %{&lt;a href=&quot;#{url_to(snip_name)}&quot;&gt;#{comments.length} comments for #{snip_name}&lt;/a&gt;}
     end
     return comments_html
   end
   
   def post(*args)
     snip_name = app.request.params[:snip]
-    existing_comments = Soup.sieve(:commenting_on =&gt; snip_name)
+    existing_comments = app.soup.sieve(:commenting_on =&gt; snip_name)
     comment = app.request.params.reject { |k,v| ![:author, :email, :website, :content].include?(k) }
     
     return &quot;You need to add some details!&quot; if comment.empty?
@@ -40,7 +40,7 @@ class Comments &lt; Dynasnip
       &quot;Sorry - your comment looks like spam, according to Defensio :(&quot;
     else
       return &quot;No spam today, thanks anyway&quot; unless app.request.params[:human] == 'human'
-      Soup &lt;&lt; comment.merge({
+      app.soup &lt;&lt; comment.merge({
        :name =&gt; &quot;#{snip_name}-comment-#{existing_comments.length + 1}&quot;, 
        :commenting_on =&gt; snip_name,
        :created_at =&gt; Time.now
@@ -65,7 +65,7 @@ class Comments &lt; Dynasnip
   end
   
   def check_for_spam(comment)
-    snip_date = Date.parse(Soup[app.request.params[:snip]].updated_at)
+    snip_date = Date.parse(app.soup[app.request.params[:snip]].updated_at)
     Defensio.configure(app.config[:defensio])
     defensio_params = {
       :comment_author_email =&gt; comment[:email], </diff>
      <filename>lib/vanilla/dynasnips/comments.rb</filename>
    </modified>
    <modified>
      <diff>@@ -10,7 +10,7 @@ class EditSnip &lt; Dynasnip
   
   def get(snip_name=nil)
     return login_required unless logged_in?
-    snip = Vanilla.snip(snip_name || app.request.params[:name])
+    snip = app.soup[snip_name || app.request.params[:name]]
     edit(snip)
   end
   
@@ -19,23 +19,23 @@ class EditSnip &lt; Dynasnip
     snip_attributes = cleaned_params
     snip_attributes.delete(:save_button)
     return 'no params' if snip_attributes.empty?
-    snip = Vanilla.snip(snip_attributes[:name])
+    snip = app.soup[snip_attributes[:name]]
     snip_attributes[:updated_at] = Time.now
     snip_attributes.each do |name, value|
       snip.__send__(:set_value, name, value)
     end
     snip.save
-    %{Saved snip #{Vanilla::Routes.link_to snip_attributes[:name]} ok}
+    %{Saved snip #{link_to snip_attributes[:name]} ok}
   rescue Exception =&gt; e
     snip_attributes[:created_at] ||= Time.now
-    Soup &lt;&lt; snip_attributes
-    %{Created snip #{Vanilla::Routes.link_to snip_attributes[:name]} ok}
+    app.soup &lt;&lt; snip_attributes
+    %{Created snip #{link_to snip_attributes[:name]} ok}
   end
   
   def edit(snip)
     renderer = Vanilla::Renderers::Erb.new(app)
     renderer.instance_eval { @snip_to_edit = snip } # hacky!
-    snip_in_edit_template = renderer.render_without_including_snips(Vanilla.snip('edit'), :template)
+    snip_in_edit_template = renderer.render_without_including_snips(app.soup['edit'], :template)
     prevent_snip_inclusion(snip_in_edit_template)
   end
   
@@ -46,7 +46,7 @@ class EditSnip &lt; Dynasnip
   end
   
   attribute :template, %{
-    &lt;form action=&quot;&lt;%= Vanilla::Routes.url_to 'edit' %&gt;&quot; method=&quot;post&quot;&gt;
+    &lt;form action=&quot;&lt;%= url_to 'edit' %&gt;&quot; method=&quot;post&quot;&gt;
     &lt;dl class=&quot;attributes&quot;&gt;
       &lt;% @snip_to_edit.attributes.each do |name, value| %&gt;
       &lt;dt&gt;&lt;%= name %&gt;&lt;/dt&gt;</diff>
      <filename>lib/vanilla/dynasnips/edit.rb</filename>
    </modified>
    <modified>
      <diff>@@ -15,6 +15,6 @@ You can also give a custom piece of text for the link, like this:
   def handle(*args)
     snip_name = args[0] || app.request.snip_name
     link_text = args[1] || &quot;Edit&quot;
-    Vanilla::Routes.edit_link(snip_name, link_text)
+    edit_link(snip_name, link_text)
   end
 end
\ No newline at end of file</diff>
      <filename>lib/vanilla/dynasnips/edit_link.rb</filename>
    </modified>
    <modified>
      <diff>@@ -2,10 +2,9 @@ require 'vanilla/dynasnip'
 
 class Index &lt; Dynasnip
   def get(*args)
-    # TODO: figure out a way around calling Soup/AR methods directly.
-    list = Soup.tuple_class.find_all_by_name('name', :order =&gt; 'updated_at DESC').map { |tuple| 
-      &quot;&lt;li&gt;#{Vanilla::Routes.link_to tuple.value}&lt;/li&gt;&quot;
+    list = app.soup.all_snips.sort { |a,b| a.updated_at &gt; b.updated_at }.map { |snip|
+      &quot;&lt;li&gt;#{link_to snip.name}&lt;/li&gt;&quot;
     }
     &quot;&lt;ol&gt;#{list}&lt;/ol&gt;&quot;
   end
-end
\ No newline at end of file
+end</diff>
      <filename>lib/vanilla/dynasnips/index.rb</filename>
    </modified>
    <modified>
      <diff>@@ -5,7 +5,7 @@ require 'date'
 class Kind &lt; Dynasnip
   def handle(kind, limit=10, as=:html)
     as = as.to_sym
-    snips = Soup.sieve(:kind =&gt; kind)
+    snips = app.soup.sieve(:kind =&gt; kind)
     entries = snips.sort_by { |s| s.created_at || '' }.reverse[0...limit.to_i].map do |snip|
       render_entry_in_template(snip, as, kind)
     end
@@ -28,7 +28,7 @@ class Kind &lt; Dynasnip
         e.content = Atom::Content::Html.new(rendered_contents)
         e.title = snip.name
         e.authors = [Atom::Person.new(:name =&gt; snip.author || domain)]
-        e.links &lt;&lt; Atom::Link.new(:href =&gt; &quot;http://#{domain}#{Vanilla::Routes.url_to(snip.name)}&quot;)
+        e.links &lt;&lt; Atom::Link.new(:href =&gt; &quot;http://#{domain}#{url_to(snip.name)}&quot;)
         e.id = &quot;tag:#{domain},#{(snip.created_at || Date.today.to_s).split[0]}:/#{snip.name}&quot;
       end
     end
@@ -59,7 +59,7 @@ class Kind &lt; Dynasnip
   attribute :snip_template, %{
     &lt;div class=&quot;snip SNIP_KIND&quot;&gt;
       &lt;div class=&quot;details&quot;&gt;
-        #{Vanilla::Routes.existing_link '#', 'SNIP_NAME'}
+        {link_to_current_snip}
         &lt;p class=&quot;created_at&quot;&gt;CREATED_AT&lt;/p&gt;
       &lt;/div&gt;
       &lt;div class=&quot;content&quot;&gt;</diff>
      <filename>lib/vanilla/dynasnips/kind.rb</filename>
    </modified>
    <modified>
      <diff>@@ -9,6 +9,6 @@ The link_to dyna lets you create links between snips:
 would insert a link to the blah snip.|
 
   def handle(snip_name, link_text=snip_name, part=nil)
-    Vanilla::Routes.link_to(link_text, snip_name, part)
+    link_to(link_text, snip_name, part)
   end
 end
\ No newline at end of file</diff>
      <filename>lib/vanilla/dynasnips/link_to.rb</filename>
    </modified>
    <modified>
      <diff>@@ -8,9 +8,9 @@ class LinkToCurrentSnip &lt; Dynasnip
   
   def handle(*args)
     if app.request.snip_name == 'edit' # we're editing so don't use this name
-      Vanilla::Routes.link_to app.request.params[:snip_to_edit]
+      link_to app.request.params[:name]
     else
-      Vanilla::Routes.link_to app.request.snip_name
+      link_to app.request.snip_name
     end
   end    
 end
\ No newline at end of file</diff>
      <filename>lib/vanilla/dynasnips/link_to_current_snip.rb</filename>
    </modified>
    <modified>
      <diff>@@ -30,7 +30,7 @@ class Notes &lt; Dynasnip
   end
 
   def render_note(note)
-    note_link = Vanilla::Routes.link_to(note.name)
+    note_link = link_to(note.name)
     note_content = Vanilla.render(note.name, nil, context, [])
     snip.note_template.gsub('[note]', note_content).gsub('[link]', note_link)
   end</diff>
      <filename>lib/vanilla/dynasnips/notes.rb</filename>
    </modified>
    <modified>
      <diff>@@ -14,6 +14,6 @@ class ShowContentInPreTag &lt; Dynasnip
   |
   
   def handle(snip_name, part=:content)
-    %{&lt;pre&gt;#{Vanilla.snip(snip_name).__send__(part || :content)}&lt;/pre&gt;}
+    %{&lt;pre&gt;#{app.soup[snip_name].__send__(part || :content)}&lt;/pre&gt;}
   end
 end
\ No newline at end of file</diff>
      <filename>lib/vanilla/dynasnips/pre.rb</filename>
    </modified>
    <modified>
      <diff>@@ -14,6 +14,6 @@ class ShowRawContent &lt; Dynasnip
   |
   
   def handle(snip_name, part=:content)
-    %{&lt;pre&gt;#{Dynasnip.escape_curly_braces(Vanilla.snip(snip_name).__send__(part || :content))}&lt;/pre&gt;}
+    %{&lt;pre&gt;#{Dynasnip.escape_curly_braces(app.soup[snip_name].__send__(part || :content))}&lt;/pre&gt;}
   end
 end
\ No newline at end of file</diff>
      <filename>lib/vanilla/dynasnips/raw.rb</filename>
    </modified>
    <modified>
      <diff>@@ -2,6 +2,6 @@ require 'vanilla/dynasnip'
 
 class UrlTo &lt; Dynasnip
   def handle(snip_name)
-    Snip[snip_name] ? Vanilla::Routes.url_to(snip_name) : &quot;[Snip '#{snip_name}' not found]&quot;
+    app.soup[snip_name] ? url_to(snip_name) : &quot;[Snip '#{snip_name}' not found]&quot;
   end
 end
\ No newline at end of file</diff>
      <filename>lib/vanilla/dynasnips/url_to.rb</filename>
    </modified>
    <modified>
      <diff>@@ -4,6 +4,7 @@ require 'vanilla/snip_reference_parser'
 module Vanilla
   module Renderers
     class Base
+      include Routes
       
       # Render a snip.
       def self.render(snip, part=:content)
@@ -20,6 +21,11 @@ module Vanilla
         @app = app
       end
       
+      # defined for the routes
+      def soup
+        @app.soup
+      end
+      
       def self.snip_regexp
         %r{(\{[^\}.]+\})}
       end
@@ -36,7 +42,7 @@ module Vanilla
             # Render the snip or snip part with the given args, and the current
             # context, but with the default renderer for that snip. We dispatch
             # *back* out to the root Vanilla.render method to do this.
-            snip = Vanilla.snip(snip_name)
+            snip = soup[snip_name]
             if snip
               app.render(snip, snip_attribute, snip_args, enclosing_snip)
             else</diff>
      <filename>lib/vanilla/renderers/base.rb</filename>
    </modified>
    <modified>
      <diff>@@ -6,8 +6,9 @@ module Vanilla
   class Request
     attr_reader :snip_name, :part, :format, :method
     
-    def initialize(env)
+    def initialize(env, app)
       @rack_request = Rack::Request.new(env)
+      @app = app
       determine_request_uri_parts
     end
 
@@ -19,7 +20,7 @@ module Vanilla
     # Returns the snip referenced by the request's URL. Performs no exception
     # handling, so if the snip does not exist, an exception will be thrown.
     def snip
-      Vanilla.snip(snip_name)
+      @app.soup[snip_name]
     end
     
     def cookies</diff>
      <filename>lib/vanilla/request.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,7 +1,8 @@
 module Vanilla
+  # Expects to be able to call 'soup' on whatever it is included into
   module Routes
     def link_to(link_text, snip_name=link_text, part=nil)
-      Vanilla.snip_exists?(snip_name) ? Vanilla::Routes.existing_link(link_text, snip_name, part) : Vanilla::Routes.new_link(snip_name)
+      soup[snip_name] ? existing_link(link_text, snip_name, part) : new_link(snip_name)
     end
 
     def url_to(snip_name, part=nil)
@@ -11,12 +12,12 @@ module Vanilla
     end
 
     def url_to_raw(snip_name, part=nil)
-      url = Vanilla::Routes.url_to(snip_name, part)
+      url = url_to(snip_name, part)
       url += &quot;.raw&quot;
     end
 
     def existing_link(link_text, snip_name=link_text, part=nil)
-      %{&lt;a href=&quot;#{Vanilla::Routes.url_to(snip_name, part)}&quot;&gt;#{link_text}&lt;/a&gt;}
+      %{&lt;a href=&quot;#{url_to(snip_name, part)}&quot;&gt;#{link_text}&lt;/a&gt;}
     end
 
     def edit_link(snip_name, link_text)
@@ -26,7 +27,5 @@ module Vanilla
     def new_link(snip_name=&quot;New&quot;)
       %[&lt;a href=&quot;/new?name=#{snip_name ? snip_name.gsub(&quot; &quot;, &quot;+&quot;) : nil}&quot; class=&quot;new&quot;&gt;#{snip_name}&lt;/a&gt;]
     end
-
-    extend self
   end
 end</diff>
      <filename>lib/vanilla/routes.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,4 +1,5 @@
-start = Snip.new(:name =&gt; 'start')
+app = Vanilla::App.new(ENV['VANILLA_CONFIG'])
+start = app.snip(:name =&gt; 'start')
 start.content = &lt;&lt;-START
 Welcome to Vanilla.rb
 =============</diff>
      <filename>lib/vanilla/snips/start.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,4 +1,5 @@
-system = Snip.new(:name =&gt; &quot;system&quot;)
+app = Vanilla::App.new(ENV['VANILLA_CONFIG'])
+system = app.snip(:name =&gt; &quot;system&quot;)
 system.content = &quot;You're in the system snip now. You probably want to {edit_link system,edit} it though.&quot;
 
 system.main_template = &lt;&lt;-HTML
@@ -9,13 +10,13 @@ system.main_template = &lt;&lt;-HTML
   &lt;title&gt;{current_snip name}&lt;/title&gt;
   &lt;script language=&quot;javascript&quot; src=&quot;/public/javascripts/jquery.js&quot;&gt;&lt;/script&gt;
   &lt;script language=&quot;javascript&quot; src=&quot;/public/javascripts/vanilla.js&quot;&gt;&lt;/script&gt;
-  &lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; media=&quot;screen&quot;  href=&quot;&lt;%= Vanilla::Routes.url_to(&quot;system&quot;, &quot;css.css&quot;) %&gt;&quot; /&gt;
+  &lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; media=&quot;screen&quot;  href=&quot;&lt;%= url_to(&quot;system&quot;, &quot;css.css&quot;) %&gt;&quot; /&gt;
 &lt;/head&gt;
 &lt;body&gt;
   &lt;div id=&quot;content&quot;&gt;
     &lt;div id=&quot;controls&quot;&gt;
       &lt;strong&gt;&lt;a href=&quot;/&quot;&gt;home&lt;/a&gt;&lt;/strong&gt;, 
-      &lt;%= Vanilla::Routes.new_link %&gt; ::
+      &lt;%= new_link %&gt; ::
       &lt;strong&gt;{link_to_current_snip}&lt;/strong&gt; &amp;rarr; 
       {edit_link}
     &lt;/div&gt;</diff>
      <filename>lib/vanilla/snips/system.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,4 +1,5 @@
-tutorial = Snip.new(:name =&gt; 'vanilla-rb-tutorial')
+app = Vanilla::App.new(ENV['VANILLA_CONFIG'])
+tutorial = app.snip(:name =&gt; 'vanilla-rb-tutorial')
 tutorial.render_as = &quot;Markdown&quot;
 tutorial.content = &lt;&lt;-END_OF_TUTORIAL
 Basic Concepts
@@ -73,17 +74,17 @@ END_OF_TUTORIAL
 
 tutorial.save
 
-tutorial_basic_snip_inclusion = Snip.new(:name =&gt; 'tutorial-basic-snip-inclusion')
+tutorial_basic_snip_inclusion = app.snip(:name =&gt; 'tutorial-basic-snip-inclusion')
 tutorial_basic_snip_inclusion.content = &lt;&lt;-EOS
 This is a snip, which includes another {link_to snip}: {tutorial-another-snip}
 EOS
 tutorial_basic_snip_inclusion.save
 
-tutorial_another_snip = Snip.new(:name =&gt; 'tutorial-another-snip')
+tutorial_another_snip = app.snip(:name =&gt; 'tutorial-another-snip')
 tutorial_another_snip.content = &quot;this is another snip!&quot;
 tutorial_another_snip.save
 
-hello_world = Snip.new(:name =&gt; 'hello_world', :render_as =&gt; &quot;Ruby&quot;)
+hello_world = app.snip(:name =&gt; 'hello_world', :render_as =&gt; &quot;Ruby&quot;)
 hello_world.content = &lt;&lt;-END_OF_RUBY
 class HelloWorld
   # although the name doesn't need to match the snip name,
@@ -106,7 +107,7 @@ HelloWorld
 END_OF_RUBY
 hello_world.save
 
-snip = Snip.new(:name =&gt; 'snip', :render_as =&gt; &quot;Markdown&quot;)
+snip = app.snip(:name =&gt; 'snip', :render_as =&gt; &quot;Markdown&quot;)
 snip.content = &lt;&lt;-EOS
 A snip is the basic building block of information for {link_to vanilla-rb}. Essentially, it is a piece of content with arbitrary attributes. Vanilla anticipates the presence of some key attributes:
 
@@ -118,7 +119,7 @@ One implementation of the snip store is {link_to soup}.
 EOS
 snip.save
 
-soup = Snip.new(:name =&gt; 'soup')
+soup = app.snip(:name =&gt; 'soup')
 soup.content = &lt;&lt;-EOS
 Soup is a data store supporting the {link_to snip}-space that {link_to vanilla-rb} expects.
 
@@ -126,7 +127,7 @@ It's hosted on github &lt;a href=&quot;http://github.com/lazyatom/soup&quot;&gt;here&lt;/a&gt;.
 EOS
 soup.save
 
-vanilla_rb = Snip.new(:name =&gt; 'vanilla-rb', :render_as =&gt; &quot;Markdown&quot;)
+vanilla_rb = app.snip(:name =&gt; 'vanilla-rb', :render_as =&gt; &quot;Markdown&quot;)
 vanilla_rb.content = &lt;&lt;-EOS
 Vanilla.rb is the software powering this site. It's a sort-of wiki/bliki thing, based on {link_to vanilla}.
 
@@ -143,9 +144,9 @@ Here's the tutorial (helpfully included from {link_to vanilla-rb-tutorial}).
 [2]: http://lazyatom.lighthouseapp.com/projects/11797-vanilla/tickets
 [3]: http://interblah.net/introducing-vanilla-rb
 EOS
-vanilla_rb.
+vanilla_rb.save
 
-vanilla = Snip.new(:name =&gt; 'vanilla', :render_as =&gt; &quot;Markdown&quot;)
+vanilla = app.snip(:name =&gt; 'vanilla', :render_as =&gt; &quot;Markdown&quot;)
 vanilla.content = &lt;&lt;-EOS
 The bliki upon which {link_to vanilla-rb} is based, writen by [Christian Langreiter][1]
 
@@ -154,4 +155,90 @@ The bliki upon which {link_to vanilla-rb} is based, writen by [Christian Langrei
 [1]: http://www.langreiter.com
 [2]: http://www.vanillasite.at
 EOS
-vanilla.save
\ No newline at end of file
+vanilla.save
+
+test = app.snip(:name =&gt; &quot;test&quot;)
+test.content =&lt;&lt;EOF
+Linking is good: {link_to bold}
+Here's a bold snip: {bold}
+
+- Here's a random number between 5 and 15: {rand 5,15}
+- Here's a random number between 1 and 90 (the default min): {rand 90}
+- Here's a random number between 1 and 100 (the default range): {rand}
+
+And lets include some textile: 
+
+{textile_example}
+
+The source for that was 
+
+{pre textile_example}
+
+And lets include some markdown!: 
+
+{markdown_example}
+
+The source for that was 
+
+{pre markdown_example}
+
+How about some {link_to debug} information: {debug}
+
+What about a missing snip? Lets try to include one: {monkey}
+
+And an error when running? {bad_dynasnip}
+
+EOF
+test.render_as = &quot;Markdown&quot;
+test.save
+
+bold = app.snip(:name =&gt; &quot;bold&quot;)
+bold.content =&lt;&lt;EOF
+Snip2 in da house!
+EOF
+bold.render_as = &quot;Bold&quot;
+bold.save
+
+textile = app.snip(:name =&gt; &quot;textile_example&quot;)
+textile.content =&lt;&lt;EOF
+
+# testing lists
+# because lists are common things
+
+monkey
+
+what the *hell* are __you__ looking at?
+
+&quot;Beyotch&quot;:http://example.com
+
+EOF
+textile.render_as = &quot;Textile&quot;
+textile.save
+
+textile = app.snip(:name =&gt; &quot;markdown_example&quot;)
+textile.content =&lt;&lt;EOF
+
+# testing header
+
+so, how are you?
+
+- item one
+- item two
+- item three
+
+
+what the *hell* are looking at, [beyotch](http://example.com)?
+EOF
+textile.render_as = &quot;Markdown&quot;
+textile.save
+
+bad_dynasnip = app.snip(:name =&gt; &quot;bad_dynasnip&quot;, :render_as =&gt; &quot;Ruby&quot;)
+bad_dynasnip.content = &lt;&lt;EOF
+class BadDynasnip
+  def get(*args)
+    raise &quot;Oh no&quot;
+  end
+end
+BadDynasnip
+EOF
+bad_dynasnip.save
\ No newline at end of file</diff>
      <filename>lib/vanilla/snips/tutorial.rb</filename>
    </modified>
    <modified>
      <diff>@@ -6,26 +6,23 @@ describe Dynasnip, &quot;when storing attributes&quot; do
     attribute :test_attribute, &quot;test attribute content&quot;
   end
   
-  before(:each) do
-    @fake_app = nil
-  end
-  
   it &quot;should make the attribute available as an instance method&quot; do
-    TestDyna.new(@fake_app).test_attribute.should == &quot;test attribute content&quot;
+    p TestDyna.new(@app).test_attribute
+    TestDyna.new(@app).test_attribute.should == &quot;test attribute content&quot;
   end
 
   it &quot;should store the attribute in the soup&quot; do
-    TestDyna.persist!
-    Soup['test_dyna'].test_attribute.should == &quot;test attribute content&quot;
+    @app.soup &lt;&lt; TestDyna.snip_attributes
+    @app.soup['test_dyna'].test_attribute.should == &quot;test attribute content&quot;
   end
   
   it &quot;should allow the attribute to be overriden by the soup contents&quot; do
-    TestDyna.persist!
-    snip = Soup['test_dyna']
+    @app.soup &lt;&lt; TestDyna.snip_attributes
+    snip = @app.soup['test_dyna']
     snip.test_attribute = &quot;altered content&quot;
     snip.save
     
-    TestDyna.new(@fake_app).test_attribute.should == &quot;altered content&quot;
+    TestDyna.new(@app).test_attribute.should == &quot;altered content&quot;
   end
   
 end
\ No newline at end of file</diff>
      <filename>spec/dynasnip_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -9,11 +9,11 @@ describe Vanilla::Renderers::Ruby do
     end
 
     before(:each) do
-      @test_dyna = TestDyna.persist!
+      @app.soup &lt;&lt; TestDyna.snip_attributes
     end
   
     it &quot;should render the result of the handle method&quot; do
-      Vanilla::Test.response_body_for(&quot;/test_dyna&quot;).should == 'handle called'
+      response_body_for(&quot;/test_dyna&quot;).should == 'handle called'
     end
   end
 
@@ -28,15 +28,15 @@ describe Vanilla::Renderers::Ruby do
     end
     
     before(:each) do
-      @dyna = RestishDyna.persist!
+      @app.soup &lt;&lt; RestishDyna.snip_attributes
     end
   
     it &quot;should render the result of the get method on GET requests&quot; do
-      Vanilla::Test.response_body_for(&quot;/restish_dyna&quot;).should == 'get called'
+      response_body_for(&quot;/restish_dyna&quot;).should == 'get called'
     end
   
     it &quot;should render the result of the post method on POST requests&quot; do
-      Vanilla::Test.response_body_for(&quot;/restish_dyna?_method=post&quot;) == 'post called'
+      response_body_for(&quot;/restish_dyna?_method=post&quot;) == 'post called'
     end
   end
   
@@ -48,12 +48,12 @@ describe Vanilla::Renderers::Ruby do
     end
     
     before(:each) do
-      @dyna = Encloser.persist!
+      @app.soup &lt;&lt; Encloser.snip_attributes
       create_snip(:name =&gt; &quot;test&quot;, :content =&gt; &quot;{encloser}&quot;)
     end
     
     it &quot;should know about the snip that called this dynasnip&quot; do
-      Vanilla::Test.response_body_for(&quot;/test&quot;).should == 'enclosing snip is test'
+      response_body_for(&quot;/test&quot;).should == 'enclosing snip is test'
     end
   end
 end
\ No newline at end of file</diff>
      <filename>spec/renderers/ruby_renderer_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -6,7 +6,7 @@ describe &quot;when detecting the snip renderer&quot; do
   end
 
   it &quot;should return the constant refered to in the render_as property of the snip&quot; do
-    snip = create_snip(:render_as =&gt; &quot;Raw&quot;)
+    snip = create_snip(:name =&gt; &quot;blah&quot;, :render_as =&gt; &quot;Raw&quot;)
     @app.renderer_for(snip).should == Vanilla::Renderers::Raw
   end
 
@@ -21,7 +21,7 @@ describe &quot;when detecting the snip renderer&quot; do
   end
 
   it &quot;should raise an error if the specified renderer doesn't exist&quot; do
-    snip = create_snip(:render_as =&gt; &quot;NonExistentClass&quot;)
+    snip = create_snip(:name =&gt; &quot;blah&quot;, :render_as =&gt; &quot;NonExistentClass&quot;)
     lambda { @app.renderer_for(snip) }.should raise_error
   end
 
@@ -29,7 +29,7 @@ describe &quot;when detecting the snip renderer&quot; do
     class ::MyRenderer
     end
   
-    snip = create_snip(:render_as =&gt; &quot;MyRenderer&quot;)
+    snip = create_snip(:name =&gt; &quot;blah&quot;, :render_as =&gt; &quot;MyRenderer&quot;)
     @app.renderer_for(snip).should == MyRenderer      
   end
 end
\ No newline at end of file</diff>
      <filename>spec/renderers/vanilla_app_detecting_renderer_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -7,22 +7,18 @@ require &quot;rack/mock&quot;
 module Vanilla
   module Test
     def setup_clean_environment
-      test_soup_config = { :database =&gt; File.join(File.dirname(__FILE__), &quot;soup_test.db&quot;)}
-      FileUtils.rm(test_soup_config[:database]) if File.exist?(test_soup_config[:database])
-      Soup.base = test_soup_config
+      FileUtils.mkdir_p(File.dirname(test_config_file))
+      clear_soup
+      File.open(test_config_file, 'w') { |f| f.write({:soup =&gt; soup_path}.to_yaml) }
+      @app = Vanilla::App.new(test_config_file)
 
-      # TODO: this is hard-coded for the AR implementation
-      require &quot;active_record&quot;
-      ActiveRecord::Migration.verbose = false
-  
-      Soup.prepare
       require &quot;vanilla/dynasnips/current_snip&quot;
-      CurrentSnip.persist!
+      @app.soup &lt;&lt; CurrentSnip.snip_attributes
       create_snip :name =&gt; &quot;system&quot;, :main_template =&gt; &quot;{current_snip}&quot;
     end
     
     def response_for(url)
-      Vanilla::App.new.call(mock_env_for_url(url))
+      @app.call(mock_env_for_url(url))
     end
     
     def response_body_for(url)
@@ -34,13 +30,13 @@ module Vanilla
     end
     
     def set_main_template(template_content)
-      system = Vanilla.snip(&quot;system&quot;) || Snip.new(:name =&gt; &quot;system&quot;)
+      system = @app.soup[&quot;system&quot;] || Snip.new({:name =&gt; &quot;system&quot;}, @app.soup)
       system.main_template = template_content
       system.save
     end
     
     def create_snip(params)
-      s = Snip.new(params)
+      s = Snip.new(params, @app.soup)
       s.save
       s
     end
@@ -53,12 +49,22 @@ module Vanilla
       Rack::Request.new(mock_env_for_url(url))
     end
     
-    extend self
+    def test_config_file
+      File.join(File.dirname(__FILE__), &quot;tmp&quot;, &quot;config.yml&quot;)
+    end
+    
+    def soup_path
+      File.expand_path(File.join(File.dirname(__FILE__), &quot;tmp&quot;, &quot;soup&quot;))
+    end
+    
+    def clear_soup
+      FileUtils.rm_rf(soup_path)
+    end
   end
 end
 
 Spec::Runner.configure do |config|
   config.include(Vanilla::Test)
-  config.before { Vanilla::Test.setup_clean_environment }
+  config.before { setup_clean_environment }
 end
 </diff>
      <filename>spec/spec_helper.rb</filename>
    </modified>
    <modified>
      <diff>@@ -4,7 +4,7 @@ describe Vanilla::App do
   describe &quot;when behaving as a Rack application&quot; do
     it &quot;should return an array of status code, headers and response&quot; do
       create_snip(:name =&gt; &quot;test&quot;, :content =&gt; &quot;content&quot;)
-      result = Vanilla::App.new.call(mock_env_for_url(&quot;/test.text&quot;))
+      result = @app.call(mock_env_for_url(&quot;/test.text&quot;))
       result.should be_a_kind_of(Array)
       result[0].should == 200
       result[1].should be_a_kind_of(Hash)
@@ -14,19 +14,19 @@ describe Vanilla::App do
   
   describe &quot;when being configured&quot; do
     it &quot;should load a config file from the current working directory by default&quot; do
-      File.should_receive(:open).with(&quot;config.yml&quot;).and_return(StringIO.new({}.to_yaml))
+      File.should_receive(:open).with(&quot;config.yml&quot;).and_return(StringIO.new({:soup =&gt; soup_path}.to_yaml))
       Vanilla::App.new
     end
     
     it &quot;should load a config file given&quot; do
-      File.open(&quot;/tmp/vanilla_config.yml&quot;, &quot;w&quot;) { |f| f.write({:hello =&gt; true}.to_yaml) }
+      File.open(&quot;/tmp/vanilla_config.yml&quot;, &quot;w&quot;) { |f| f.write({:soup =&gt; soup_path, :hello =&gt; true}.to_yaml) }
       app = Vanilla::App.new(&quot;/tmp/vanilla_config.yml&quot;)
       app.config[:hello].should be_true
     end
     
     it &quot;should allow saving of configuration to the same file it was loaded from&quot; do
       config_file = &quot;/tmp/vanilla_config.yml&quot;
-      File.open(config_file, &quot;w&quot;) { |f| f.write({:hello =&gt; true}.to_yaml) }
+      File.open(config_file, &quot;w&quot;) { |f| f.write({:soup =&gt; soup_path, :hello =&gt; true}.to_yaml) }
       app = Vanilla::App.new(config_file)
       app.config[:saved] = true
       app.config.save!</diff>
      <filename>spec/vanilla_app_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -2,7 +2,7 @@ require File.join(File.dirname(__FILE__), &quot;spec_helper&quot;)
 
 describe Vanilla::App do  
   before(:each) do
-    LinkTo.persist!
+    @app.soup &lt;&lt; LinkTo.snip_attributes
     set_main_template &quot;&lt;tag&gt;{current_snip}&lt;/tag&gt;&quot;
     create_snip :name =&gt; &quot;test&quot;, :content =&gt; &quot;blah {other_snip}&quot;, :part =&gt; 'part content'
     create_snip :name =&gt; &quot;other_snip&quot;, :content =&gt; &quot;blah!&quot;
@@ -67,7 +67,7 @@ describe Vanilla::App do
   
   describe &quot;when a missing snip is requested&quot; do
     it &quot;should render missing snip content in the main template&quot; do
-      response_body_for(&quot;/missing_snip&quot;).should == &quot;&lt;tag&gt;Couldn't find snip #{LinkTo.new(nil).handle(&quot;missing_snip&quot;)}&lt;/tag&gt;&quot;
+      response_body_for(&quot;/missing_snip&quot;).should == &quot;&lt;tag&gt;Couldn't find snip #{LinkTo.new(@app).handle(&quot;missing_snip&quot;)}&lt;/tag&gt;&quot;
     end
     
     it &quot;should have a 404 response code&quot; do</diff>
      <filename>spec/vanilla_presenting_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,14 +1,14 @@
 require File.join(File.dirname(__FILE__), &quot;spec_helper&quot;)
 
 describe Vanilla::Request, &quot;when requesting urls&quot; do
-  before(:each) { @request = Vanilla::Request.new(mock_env_for_url(&quot;/snip&quot;)) }
+  before(:each) { @request = Vanilla::Request.new(mock_env_for_url(&quot;/snip&quot;), @app) }
   
   it &quot;should use the first segement as the snip name&quot; do
     @request.snip_name.should == &quot;snip&quot;
   end
   
   it &quot;should try to load the snip based on the snip name&quot; do
-    Vanilla.should_receive(:snip).with('snip').and_return(:snip)
+    @app.soup.should_receive(:[]).with('snip').and_return(:snip)
     @request.snip.should == :snip
   end
   
@@ -26,7 +26,7 @@ describe Vanilla::Request, &quot;when requesting urls&quot; do
 end
 
 describe Vanilla::Request, &quot;when requesting a snip part&quot; do
-  before(:each) { @request = Vanilla::Request.new(mock_env_for_url(&quot;/snip/part&quot;)) }
+  before(:each) { @request = Vanilla::Request.new(mock_env_for_url(&quot;/snip/part&quot;), @app) }
   
   it &quot;should use the first segment as the snip, and the second segment as the part&quot; do
     @request.snip_name.should == &quot;snip&quot;
@@ -39,7 +39,7 @@ describe Vanilla::Request, &quot;when requesting a snip part&quot; do
 end
 
 describe Vanilla::Request, &quot;when requesting a snip with a format&quot; do
-  before(:each) { @request = Vanilla::Request.new(mock_env_for_url(&quot;/snip.raw&quot;)) }
+  before(:each) { @request = Vanilla::Request.new(mock_env_for_url(&quot;/snip.raw&quot;), @app) }
   
   it &quot;should use the extension as the format&quot; do
     @request.format.should == &quot;raw&quot;
@@ -51,7 +51,7 @@ describe Vanilla::Request, &quot;when requesting a snip with a format&quot; do
 end
 
 describe Vanilla::Request, &quot;when requesting a snip part with a format&quot; do
-  before(:each) { @request = Vanilla::Request.new(mock_env_for_url(&quot;/snip/part.raw&quot;)) }
+  before(:each) { @request = Vanilla::Request.new(mock_env_for_url(&quot;/snip/part.raw&quot;), @app) }
   
   it &quot;should use the extension as the format&quot; do
     @request.format.should == &quot;raw&quot;
@@ -68,6 +68,6 @@ end
 
 describe Vanilla::Request, &quot;when requested with a _method paramter&quot; do
   it &quot;should return the method using the parameter&quot; do
-    Vanilla::Request.new(mock_env_for_url(&quot;/snip?_method=put&quot;)).method.should == 'put'
+    Vanilla::Request.new(mock_env_for_url(&quot;/snip?_method=put&quot;), @app).method.should == 'put'
   end
 end
\ No newline at end of file</diff>
      <filename>spec/vanilla_request_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -6,12 +6,12 @@ Gem::Specification.new do |s|
 
   s.required_rubygems_version = Gem::Requirement.new(&quot;&gt;= 0&quot;) if s.respond_to? :required_rubygems_version=
   s.authors = [&quot;James Adam&quot;]
-  s.date = %q{2009-08-28}
+  s.date = %q{2009-09-25}
   s.default_executable = %q{vanilla}
   s.email = %q{james@lazyatom.com.com}
   s.executables = [&quot;vanilla&quot;]
   s.extra_rdoc_files = [&quot;README&quot;]
-  s.files = [&quot;config.example.yml&quot;, &quot;config.ru&quot;, &quot;Rakefile&quot;, &quot;README&quot;, &quot;spec/dynasnip_spec.rb&quot;, &quot;spec/renderers&quot;, &quot;spec/renderers/base_renderer_spec.rb&quot;, &quot;spec/renderers/erb_renderer_spec.rb&quot;, &quot;spec/renderers/markdown_renderer_spec.rb&quot;, &quot;spec/renderers/raw_renderer_spec.rb&quot;, &quot;spec/renderers/ruby_renderer_spec.rb&quot;, &quot;spec/renderers/vanilla_app_detecting_renderer_spec.rb&quot;, &quot;spec/soup_test.db&quot;, &quot;spec/spec_helper.rb&quot;, &quot;spec/vanilla_app_spec.rb&quot;, &quot;spec/vanilla_presenting_spec.rb&quot;, &quot;spec/vanilla_request_spec.rb&quot;, &quot;spec/vanilla_snip_finding_spec.rb&quot;, &quot;lib/defensio.rb&quot;, &quot;lib/tasks&quot;, &quot;lib/tasks/vanilla.rake&quot;, &quot;lib/vanilla&quot;, &quot;lib/vanilla/app.rb&quot;, &quot;lib/vanilla/console.rb&quot;, &quot;lib/vanilla/dynasnip.rb&quot;, &quot;lib/vanilla/dynasnips&quot;, &quot;lib/vanilla/dynasnips/comments.rb&quot;, &quot;lib/vanilla/dynasnips/current_snip.rb&quot;, &quot;lib/vanilla/dynasnips/debug.rb&quot;, &quot;lib/vanilla/dynasnips/edit.rb&quot;, &quot;lib/vanilla/dynasnips/edit_link.rb&quot;, &quot;lib/vanilla/dynasnips/index.rb&quot;, &quot;lib/vanilla/dynasnips/kind.rb&quot;, &quot;lib/vanilla/dynasnips/link_to.rb&quot;, &quot;lib/vanilla/dynasnips/link_to_current_snip.rb&quot;, &quot;lib/vanilla/dynasnips/login.rb&quot;, &quot;lib/vanilla/dynasnips/new.rb&quot;, &quot;lib/vanilla/dynasnips/notes.rb&quot;, &quot;lib/vanilla/dynasnips/pre.rb&quot;, &quot;lib/vanilla/dynasnips/rand.rb&quot;, &quot;lib/vanilla/dynasnips/raw.rb&quot;, &quot;lib/vanilla/dynasnips/url_to.rb&quot;, &quot;lib/vanilla/renderers&quot;, &quot;lib/vanilla/renderers/base.rb&quot;, &quot;lib/vanilla/renderers/bold.rb&quot;, &quot;lib/vanilla/renderers/erb.rb&quot;, &quot;lib/vanilla/renderers/markdown.rb&quot;, &quot;lib/vanilla/renderers/raw.rb&quot;, &quot;lib/vanilla/renderers/ruby.rb&quot;, &quot;lib/vanilla/renderers/textile.rb&quot;, &quot;lib/vanilla/request.rb&quot;, &quot;lib/vanilla/routes.rb&quot;, &quot;lib/vanilla/snip_handling.rb&quot;, &quot;lib/vanilla/snip_reference.rb&quot;, &quot;lib/vanilla/snip_reference.treetop&quot;, &quot;lib/vanilla/snip_reference_parser.rb&quot;, &quot;lib/vanilla/snips&quot;, &quot;lib/vanilla/snips/start.rb&quot;, &quot;lib/vanilla/snips/system.rb&quot;, &quot;lib/vanilla/snips/tutorial.rb&quot;, &quot;lib/vanilla/test_snips.rb&quot;, &quot;lib/vanilla.rb&quot;, &quot;bin/vanilla&quot;, &quot;public/hatch.png&quot;, &quot;public/javascripts&quot;, &quot;public/javascripts/jquery.autogrow-textarea.js&quot;, &quot;public/javascripts/jquery.js&quot;, &quot;public/javascripts/vanilla.js&quot;]
+  s.files = [&quot;config.example.yml&quot;, &quot;config.ru&quot;, &quot;Rakefile&quot;, &quot;README&quot;, &quot;spec/dynasnip_spec.rb&quot;, &quot;spec/renderers&quot;, &quot;spec/renderers/base_renderer_spec.rb&quot;, &quot;spec/renderers/erb_renderer_spec.rb&quot;, &quot;spec/renderers/markdown_renderer_spec.rb&quot;, &quot;spec/renderers/raw_renderer_spec.rb&quot;, &quot;spec/renderers/ruby_renderer_spec.rb&quot;, &quot;spec/renderers/vanilla_app_detecting_renderer_spec.rb&quot;, &quot;spec/spec_helper.rb&quot;, &quot;spec/tmp&quot;, &quot;spec/tmp/config.yml&quot;, &quot;spec/tmp/soup&quot;, &quot;spec/tmp/soup/current_snip.yml&quot;, &quot;spec/tmp/soup/system.yml&quot;, &quot;spec/vanilla_app_spec.rb&quot;, &quot;spec/vanilla_presenting_spec.rb&quot;, &quot;spec/vanilla_request_spec.rb&quot;, &quot;lib/defensio.rb&quot;, &quot;lib/tasks&quot;, &quot;lib/tasks/vanilla.rake&quot;, &quot;lib/vanilla&quot;, &quot;lib/vanilla/app.rb&quot;, &quot;lib/vanilla/console.rb&quot;, &quot;lib/vanilla/dynasnip.rb&quot;, &quot;lib/vanilla/dynasnips&quot;, &quot;lib/vanilla/dynasnips/comments.rb&quot;, &quot;lib/vanilla/dynasnips/current_snip.rb&quot;, &quot;lib/vanilla/dynasnips/debug.rb&quot;, &quot;lib/vanilla/dynasnips/edit.rb&quot;, &quot;lib/vanilla/dynasnips/edit_link.rb&quot;, &quot;lib/vanilla/dynasnips/index.rb&quot;, &quot;lib/vanilla/dynasnips/kind.rb&quot;, &quot;lib/vanilla/dynasnips/link_to.rb&quot;, &quot;lib/vanilla/dynasnips/link_to_current_snip.rb&quot;, &quot;lib/vanilla/dynasnips/login.rb&quot;, &quot;lib/vanilla/dynasnips/new.rb&quot;, &quot;lib/vanilla/dynasnips/notes.rb&quot;, &quot;lib/vanilla/dynasnips/pre.rb&quot;, &quot;lib/vanilla/dynasnips/rand.rb&quot;, &quot;lib/vanilla/dynasnips/raw.rb&quot;, &quot;lib/vanilla/dynasnips/url_to.rb&quot;, &quot;lib/vanilla/renderers&quot;, &quot;lib/vanilla/renderers/base.rb&quot;, &quot;lib/vanilla/renderers/bold.rb&quot;, &quot;lib/vanilla/renderers/erb.rb&quot;, &quot;lib/vanilla/renderers/markdown.rb&quot;, &quot;lib/vanilla/renderers/raw.rb&quot;, &quot;lib/vanilla/renderers/ruby.rb&quot;, &quot;lib/vanilla/renderers/textile.rb&quot;, &quot;lib/vanilla/request.rb&quot;, &quot;lib/vanilla/routes.rb&quot;, &quot;lib/vanilla/snip_reference.rb&quot;, &quot;lib/vanilla/snip_reference.treetop&quot;, &quot;lib/vanilla/snip_reference_parser.rb&quot;, &quot;lib/vanilla/snips&quot;, &quot;lib/vanilla/snips/start.rb&quot;, &quot;lib/vanilla/snips/system.rb&quot;, &quot;lib/vanilla/snips/tutorial.rb&quot;, &quot;lib/vanilla.rb&quot;, &quot;bin/vanilla&quot;, &quot;public/hatch.png&quot;, &quot;public/javascripts&quot;, &quot;public/javascripts/jquery.autogrow-textarea.js&quot;, &quot;public/javascripts/jquery.js&quot;, &quot;public/javascripts/vanilla.js&quot;]
   s.homepage = %q{http://github.com/lazyatom/vanilla-rb}
   s.rdoc_options = [&quot;--main&quot;, &quot;README&quot;]
   s.require_paths = [&quot;lib&quot;]</diff>
      <filename>vanilla.gemspec</filename>
    </modified>
  </modified>
  <removed type="array">
    <removed>
      <filename>lib/vanilla/snip_handling.rb</filename>
    </removed>
    <removed>
      <filename>lib/vanilla/test_snips.rb</filename>
    </removed>
    <removed>
      <filename>spec/vanilla_snip_finding_spec.rb</filename>
    </removed>
  </removed>
  <parents type="array">
    <parent>
      <id>edf0bb6a9d0a84cbedc115d66efdbb4cf24d4b2d</id>
    </parent>
  </parents>
  <author>
    <name>James Adam</name>
    <email>james@lazyatom.com</email>
  </author>
  <url>http://github.com/lazyatom/vanilla-rb/commit/b3b44e2bffea809675c230bdfb09ac184c1f1500</url>
  <id>b3b44e2bffea809675c230bdfb09ac184c1f1500</id>
  <committed-date>2009-09-27T05:21:13-07:00</committed-date>
  <authored-date>2009-09-25T10:26:29-07:00</authored-date>
  <message>Sweeping changes which co-incide with switching soup to a file-based store.

Most notably:

* Routing methods are no longer static module methods, but included in
  the renderers (e.g. link_to, url_for, etc)
* The interface to the soup is consistent - Vanilla::App#soup returns
  the soup instance, and is available via the app attribute of renderers
  and dynasnips
* Some direct accesses to private Soup implementations have been 'fixed'.</message>
  <tree>4adb6dd25c8fd4a4c2ee405b4b354c27eaa74a64</tree>
  <committer>
    <name>James Adam</name>
    <email>james@lazyatom.com</email>
  </committer>
</commit>
