<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -34,6 +34,12 @@ lib/hobo/dryml.rb
 lib/hobo/generator.rb
 lib/hobo/guest.rb
 lib/hobo/hobo_helper.rb
+lib/hobo/lifecycles/actions.rb
+lib/hobo/lifecycles/creator.rb
+lib/hobo/lifecycles/lifecycle.rb
+lib/hobo/lifecycles/state.rb
+lib/hobo/lifecycles/transition.rb
+lib/hobo/lifecycles.rb
 lib/hobo/model.rb
 lib/hobo/model_controller.rb
 lib/hobo/model_router.rb
@@ -74,7 +80,6 @@ rails_generators/hobo_model_controller/hobo_model_controller_generator.rb
 rails_generators/hobo_model_controller/templates/controller.rb
 rails_generators/hobo_model_controller/templates/functional_test.rb
 rails_generators/hobo_model_controller/templates/helper.rb
-rails_generators/hobo_model_controller/templates/view.html.erb
 rails_generators/hobo_model_controller/USAGE
 rails_generators/hobo_model_resource/hobo_model_resource_generator.rb
 rails_generators/hobo_model_resource/templates/controller.rb
@@ -85,6 +90,8 @@ rails_generators/hobo_rapid/templates/hobo-rapid.css
 rails_generators/hobo_rapid/templates/hobo-rapid.js
 rails_generators/hobo_rapid/templates/IE7.js
 rails_generators/hobo_rapid/templates/lowpro.js
+rails_generators/hobo_rapid/templates/nicedit.js
+rails_generators/hobo_rapid/templates/nicEditorIcons.gif
 rails_generators/hobo_rapid/templates/reset.css
 rails_generators/hobo_rapid/templates/themes/clean/public/images/fieldbg.gif
 rails_generators/hobo_rapid/templates/themes/clean/public/images/pencil.png
@@ -132,6 +139,8 @@ rails_generators/hobo_user_controller/templates/helper.rb
 rails_generators/hobo_user_controller/USAGE
 rails_generators/hobo_user_model/hobo_user_model_generator.rb
 rails_generators/hobo_user_model/templates/fixtures.yml
+rails_generators/hobo_user_model/templates/forgot_password.erb
+rails_generators/hobo_user_model/templates/mailer.erb
 rails_generators/hobo_user_model/templates/model.rb
 rails_generators/hobo_user_model/templates/unit_test.rb
 rails_generators/hobo_user_model/USAGE
@@ -144,6 +153,8 @@ taglibs/rapid_document_tags.dryml
 taglibs/rapid_editing.dryml
 taglibs/rapid_forms.dryml
 taglibs/rapid_generics.dryml
+taglibs/rapid_lifecycle_pages.dryml
+taglibs/rapid_lifecycles.dryml
 taglibs/rapid_navigation.dryml
 taglibs/rapid_pages.dryml
 taglibs/rapid_plus.dryml</diff>
      <filename>hobo/Manifest</filename>
    </modified>
    <modified>
      <diff>@@ -64,7 +64,7 @@ end
 puts &quot;\nGenerating Rails app...\n&quot;
 opts = []
 opts &lt;&lt; &quot;-d #{database_type}&quot; if database_type
-system(&quot;rails #{opts * ' '} #{app_path}&quot;)
+system(&quot;rails _2.0.2_ #{opts * ' '} #{app_path}&quot;)
 
 
 Dir.chdir(app_path) do</diff>
      <filename>hobo/bin/hobo</filename>
    </modified>
    <modified>
      <diff>@@ -9,6 +9,9 @@ begin
 rescue MissingSourceFile
   # OK, Hobo won't do pagination then
 end
+require &quot;active_record&quot;
+require &quot;action_controller&quot;
+require &quot;action_view&quot;
 
 # Monkey patches, ooh ooh
 require 'active_record/has_many_association'</diff>
      <filename>hobo/lib/hobo.rb</filename>
    </modified>
    <modified>
      <diff>@@ -9,7 +9,6 @@ require 'hobo/dryml/taglib'
 require 'hobo/dryml/tag_parameters'
 require 'hobo/dryml/template_environment'
 require 'hobo/dryml/template_handler'
-require 'hobo/dryml/tag_extractor'
 module Hobo
 
   module Dryml</diff>
      <filename>hobo/lib/hobo/dryml.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,20 +1,22 @@
+%w[lifecycle actions creator state transition].each { |lib| require &quot;hobo/lifecycles/#{lib}&quot; }
+
 module Hobo
-  
+
   module Lifecycles
-    
+
     class LifecycleError &lt; RuntimeError; end
 
     class LifecycleKeyError &lt; LifecycleError; end
-    
+
     ModelExtensions = classy_module do
-      
+
       attr_writer :lifecycle
 
       def self.lifecycle(*args, &amp;block)
         options = args.extract_options!
         options = options.reverse_merge(:state_field =&gt; :state,
                                         :key_timestamp_field =&gt; :key_timestamp)
-        
+
         if defined? self::Lifecycle
           lifecycle = self::Lifecycle
         else
@@ -22,62 +24,62 @@ module Hobo
           lifecycle = self::Lifecycle
           lifecycle.init(self, options)
         end
-        
+
         dsl = DeclarationDSL.new(lifecycle)
         dsl.instance_eval(&amp;block)
-          
+
         default = lifecycle.initial_state ? { :default =&gt; lifecycle.initial_state.name } : {}
         declare_field(options[:state_field], :string, default)
-        
+
         declare_field(options[:key_timestamp_field], :datetime)
-        
+
         never_show      options[:state_field], options[:key_timestamp_field]
         attr_protected  options[:state_field], options[:key_timestamp_field]
       end
-      
-      
+
+
       def self.has_lifecycle?
         defined?(self::Lifecycle)
       end
-    
-      
+
+
       def lifecycle
         @lifecycle ||= self.class::Lifecycle.new(self)
       end
-      
-      
+
+
       def become(state)
         self.lifecycle.state = state
       end
-      
+
     end
-    
-    
+
+
     class DeclarationDSL
-      
+
       def initialize(lifecycle)
         @lifecycle = lifecycle
       end
-      
+
       def state(*names, &amp;block)
         names.map {|name| @lifecycle.def_state(name, block) }
       end
-      
+
       def initial_state(name, &amp;block)
         s = @lifecycle.def_state(name, block)
         @lifecycle.initial_state = s
       end
-      
+
       def create(who, name, options={}, &amp;block)
         @lifecycle.def_creator(name, who, block, options)
       end
-      
+
       def transition(who, name, change, options={}, &amp;block)
         @lifecycle.def_transition(name, who,
                                   Array(change.keys.first), change.values.first,
                                   block, options)
       end
-      
+
       def invariant(&amp;block)
         @lifecycle.invariants &lt;&lt; block
       end
@@ -85,8 +87,8 @@ module Hobo
       def precondition(&amp;block)
         @lifecycle.preconditions &lt;&lt; block
       end
-      
+
     end
-    
+
   end
 end</diff>
      <filename>hobo/lib/hobo/lifecycles.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,15 +1,15 @@
 module Hobo
-  
+
   module Lifecycles
-    
+
     class Lifecycle
-      
+
       def self.init(model, options)
         @model   = model
         @options = options
         reset
       end
-      
+
       def self.reset
         @states        = {}
         @creators      = {}
@@ -17,12 +17,12 @@ module Hobo
         @preconditions = []
         @invariants    = []
       end
-      
+
       class &lt;&lt; self
         attr_accessor :model, :options, :states, :initial_state,
                       :creators, :transitions, :invariants, :preconditions
       end
-      
+
       def self.def_state(name, on_enter)
         name = name.to_s
         returning(State.new(name, on_enter)) do |s|
@@ -30,12 +30,12 @@ module Hobo
           class_eval &quot;def #{name}?; record.state == '#{name}'; end&quot;
         end
       end
-      
-      
+
+
       def self.def_creator(name, who, on_create, options)
         name = name.to_s
         returning(Creator.new(self, name, who, on_create, options)) do |creator|
-          
+
           class_eval %{
                        def self.#{name}(user, attributes=nil)
                          create('#{name}', user, attributes)
@@ -44,13 +44,13 @@ module Hobo
                          can_create?('#{name}', user, attributes)
                        end
                       }
-          
+
        end
       end
-      
+
       def self.def_transition(name, who, start_state, end_states, on_transition, options)
         returning(Transition.new(self, name.to_s, who, start_state, end_states, on_transition, options)) do |t|
-          
+
           class_eval %{
                        def #{name}(user, attributes=nil)
                          transition('#{name}', user, attributes)
@@ -59,96 +59,96 @@ module Hobo
                          can_transition?('#{name}', user, attributes)
                        end
                       }
-          
+
         end
       end
-                 
+
       def self.state_names
         states.keys
       end
-                 
-      
+
+
       def self.can_create?(name, user, attributes=nil)
         creators[name.to_s].allowed?(user, attributes)
       end
-      
-      
+
+
       def self.create(name, user, attributes=nil)
         creators[name.to_s].run!(user, attributes)
       end
-      
-      
+
+
       def self.creator_names
         creators.keys
       end
-      
-      
+
+
       def self.transition_names
         transitions.*.name.uniq
       end
-      
-      
+
+
       def self.state_field
         options[:state_field]
       end
-      
-      
+
+
       # --- Instance Features --- #
-      
+
       attr_reader :record
-      
+
       attr_accessor :provided_key, :current_key
-      
-      
+
+
       def initialize(record)
         @record = record
       end
-      
+
 
       def can_transition?(name, user, attributes=nil)
         available_transitions_for(user, name, attributes).any?
       end
-      
-      
+
+
       def transition(name, user, attributes=nil)
         transition = find_transition(name, user, attributes)
         transition.run!(record, user, attributes)
       end
 
-      
+
       def find_transition(name, user, attributes=nil)
-        available_transitions_for(user, name, attributes).first or 
-          raise LifecycleError, &quot;No #{name} transition available to #{user} on this #{record.class.name}&quot; 
+        available_transitions_for(user, name, attributes).first or
+          raise LifecycleError, &quot;No #{name} transition available to #{user} on this #{record.class.name}&quot;
       end
-      
-      
+
+
       def state_name
         record.read_attribute self.class.state_field
       end
-      
-      
+
+
       def state
         self.class.states[state_name]
       end
-      
-      
+
+
       def available_transitions
         state.transitions_out
       end
-      
-      
+
+
       def available_transitions_for(user, name=nil, attributes=nil)
         matches = available_transitions
         matches = matches.select { |t| t.name == name.to_s } if name
         matches.select { |t| t.allowed?(record, user, attributes) }
       end
-      
-      
+
+
       def state=(state_name)
         state_name = state_name.to_s
         if self.state != state_name
           record.write_attribute self.class.state_field, state_name
-          
+
           if state_name == &quot;destroy&quot;
             record.destroy
           else
@@ -160,39 +160,39 @@ module Hobo
           end
         end
       end
-      
-      
+
+
       def key_timestamp_field
         record.class::Lifecycle.options[:key_timestamp_field]
       end
-      
-      
+
+
       def generate_key
         key_timestamp = Time.now
         record.write_attribute key_timestamp_field, key_timestamp
         current_key
       end
-      
-      
+
+
       def current_key
         require 'digest/sha1'
         Digest::SHA1.hexdigest(&quot;#{record.id}-#{state_name}-#{record.read_attribute key_timestamp_field}&quot;)
       end
-      
+
       def valid_key?
         provided_key == current_key
       end
-      
-      
+
+
       def invariants_satisfied?
         self.class.invariants.all? { |i| record.instance_eval(&amp;i) }
       end
-      
+
       def preconditions_satisfied?
         self.class.preconditions.all? { |i| record.instance_eval(&amp;i) }
       end
-      
-    end      
+
+    end
 
   end
 end</diff>
      <filename>hobo/lib/hobo/lifecycles/lifecycle.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,5 @@
+require 'hobo/lifecycles'
+
 module Hobo
 
   module Model</diff>
      <filename>hobo/lib/hobo/model.rb</filename>
    </modified>
    <modified>
      <diff>@@ -27,10 +27,10 @@ module Hobo
           before_filter :set_no_cache_headers
 
           rescue_from ActiveRecord::RecordNotFound, :with =&gt; :not_found
-              
+
           rescue_from Hobo::Model::PermissionDeniedError,  :with =&gt; :permission_denied
           rescue_from Hobo::Lifecycles::LifecycleKeyError, :with =&gt; :permission_denied
-          
+
           alias_method_chain :render, :hobo_model
 
         end
@@ -141,19 +141,12 @@ module Hobo
         collections.each { |c| def_collection_actions(c.to_sym) }
         def_lifecycle_actions
       end
-      
-      
-      def def_auto_action(name, &amp;block)        
-        define_method name, &amp;block if name.not_in?(instance_methods) &amp;&amp; include_action?(name)
-      end
-
 
 
       def def_auto_action(name, &amp;block)
         define_method name, &amp;block if name.not_in?(instance_methods) &amp;&amp; include_action?(name)
       end
 
-
       def def_collection_actions(name)
         def_auto_action name do
           hobo_show_collection(name)
@@ -169,19 +162,19 @@ module Hobo
           end
         end
       end
-      
-      
+
+
       def def_lifecycle_actions
         if model.has_lifecycle?
           model::Lifecycle.creator_names.each do |creator|
-            def_auto_action &quot;#{creator}_page&quot; do 
+            def_auto_action &quot;#{creator}_page&quot; do
               creator_page_action creator
             end
-            def_auto_action creator do 
+            def_auto_action creator do
               creator_action creator
             end
           end
-          
+
           model::Lifecycle.transition_names.each do |transition|
             def_auto_action &quot;#{transition}_page&quot; do
               transition_page_action transition
@@ -206,7 +199,7 @@ module Hobo
         end
       end
 
-      
+
       def index_action(*names, &amp;block)
         options = names.extract_options!
         index_actions.concat(names)
@@ -223,7 +216,7 @@ module Hobo
         end
       end
 
-      
+
       def publish_collection(*names)
         collections.concat(names)
         names.each {|n| def_collection_actions(n)}
@@ -237,8 +230,8 @@ module Hobo
 
       def available_auto_actions
         (available_auto_read_actions +
-         available_auto_write_actions + 
-         FORM_ACTIONS + 
+         available_auto_write_actions +
+         FORM_ACTIONS +
          available_auto_collection_actions +
          available_auto_lifecycle_actions).uniq
       end
@@ -263,8 +256,8 @@ module Hobo
           [c, &quot;new_#{c.to_s.singularize}&quot;.to_sym, &quot;create_#{c.to_s.singularize}&quot;.to_sym]
         end.flatten
       end
-      
-      
+
+
       def available_auto_lifecycle_actions
         # For each creator/transition there are two possible
         # actions. e.g. for signup, 'signup_page' would be routed to
@@ -279,7 +272,7 @@ module Hobo
       end
 
     end # of ClassMethods
-    
+
 
     protected
 
@@ -505,9 +498,9 @@ module Hobo
         end
     end
 
-    
+
     # --- Collection Actions --- #
-    
+
     def hobo_show_collection(association, *args, &amp;b)
       options = args.extract_options!
       association = find_instance.send(association) if association.is_a?(String, Symbol)
@@ -541,7 +534,7 @@ module Hobo
 
 
     # --- Lifecycle Actions --- #
-    
+
     def creator_action(name, &amp;b)
       @creator = model::Lifecycle.creators[name.to_s]
       self.this = @creator.run!(current_user, attribute_parameters)
@@ -553,42 +546,42 @@ module Hobo
           re_render_form(name)
         end
     end
-    
-    
+
+
     def creator_page_action(name)
       self.this = model.new
       @creator = model::Lifecycle.creators[name]
       dryml_fallback_tag &quot;lifecycle_start_page&quot;
     end
-    
-    
+
+
     def prepare_for_transition(name, options={})
       self.this = find_instance
       this.exempt_from_edit_checks = true
       this.lifecycle.provided_key = params[:key]
-      @transition = this.lifecycle.find_transition(name, current_user)      
+      @transition = this.lifecycle.find_transition(name, current_user)
     end
 
-    
+
     def transition_action(name, *args, &amp;b)
       prepare_for_transition(name)
       @transition.run!(this, current_user, attribute_parameters)
-      response_block(&amp;b) or 
+      response_block(&amp;b) or
         if valid?
           redirect_to destination_after_submit
         else
           dryml_fallback_tag &quot;lifecycle_transition_page&quot;
-          re_render_form(name)          
+          re_render_form(name)
         end
     end
-    
+
 
     def transition_page_action(name, *args)
       options = args.extract_options!
       prepare_for_transition(name, options)
       dryml_fallback_tag &quot;lifecycle_transition_page&quot;
     end
-    
+
     # --- Miscelaneous Actions --- #
 
     def hobo_completions(attribute, finder, options={})</diff>
      <filename>hobo/lib/hobo/model_controller.rb</filename>
    </modified>
    <modified>
      <diff>@@ -4,36 +4,36 @@ module Hobo
 
     class &lt;&lt; self
       def included(base)
-        base.class_eval do 
+        base.class_eval do
           filter_parameter_logging &quot;password&quot;
           skip_before_filter :login_required, :only =&gt; [:login, :signup]
-          
+
           include_taglib &quot;rapid_user_pages&quot;, :plugin =&gt; &quot;hobo&quot;
-          
+
           show_action :account
-          
+
           alias_method_chain :hobo_update, :account_flash
         end
       end
     end
-    
+
     def login; hobo_login; end
-    
+
     def signup; hobo_signup; end
-    
+
     def logout; hobo_logout; end
-    
+
     def forgot_password; hobo_forgot_password; end
-    
+
     def reset_password; hobo_reset_password; end
-    
+
     private
-    
+
     def hobo_login(options={})
       login_attr = model.login_attribute.to_s.titleize.downcase
       options.reverse_merge!(:success_notice =&gt; &quot;You have logged in.&quot;,
                              :failure_notice =&gt; &quot;You did not provide a valid #{login_attr} and password.&quot;)
-      
+
       if request.post?
         user = model.authenticate(params[:login], params[:password])
         if user.nil?
@@ -41,7 +41,7 @@ module Hobo
         else
           old_user = current_user
           self.current_user = user
-          
+
           # If supplied, a block can be used to test if this user is
           # allowed to log in (e.g. the account may be disabled)
           account_available = block_given? ? yield : true
@@ -62,7 +62,7 @@ module Hobo
       end
     end
 
-    
+
     def hobo_signup(&amp;b)
       creator_action(:signup) do
         response_block(&amp;b) or if valid?
@@ -73,7 +73,7 @@ module Hobo
       end
     end
 
-    
+
     def hobo_logout(options={})
       options = options.reverse_merge(:notice =&gt; &quot;You have logged out.&quot;,
                                       :redirect_to =&gt; base_url)
@@ -83,8 +83,8 @@ module Hobo
       flash[:notice] ||= options[:notice]
       redirect_back_or_default(options[:redirect_to]) unless performed?
     end
-    
-    
+
+
     def hobo_forgot_password
       if request.post?
         user = model.find_by_email_address(params[:email_address])
@@ -95,28 +95,28 @@ module Hobo
         render_tag :forgot_password_email_sent_page
       end
     end
-    
-    
+
+
     def hobo_reset_password(&amp;b)
       transition_action :reset_password do
         response_block(&amp;b) or if valid?
                                 self.current_user = this
                                 flash[:notice] = &quot;Your password has been reset&quot;
-                                redirect_to home_page 
+                                redirect_to home_page
                               end
       end
     end
-    
-    
+
+
     def hobo_update_with_account_flash(*args)
       hobo_update_without_account_flash(*args) do
         flash[:notice] = &quot;Changes to your account were saved&quot; if valid? &amp;&amp; @this == current_user
         yield if block_given?
       end
     end
-    
+
     private
-    
+
     def logout_current_user
       if logged_in?
         current_user.forget_me
@@ -125,7 +125,7 @@ module Hobo
         self.current_user = nil
       end
     end
-    
+
   end
-  
+
 end</diff>
      <filename>hobo/lib/hobo/user_controller.rb</filename>
    </modified>
    <modified>
      <diff>@@ -2,6 +2,7 @@ class &lt;%= class_name %&gt;Controller &lt; ApplicationController
 
   hobo_model_controller
 
+  # changes require server restart
   auto_actions :all
 
 end</diff>
      <filename>hobo/rails_generators/hobo_model_controller/templates/controller.rb</filename>
    </modified>
    <modified>
      <diff>@@ -2,6 +2,7 @@ class &lt;%= controller_class_name %&gt;Controller &lt; ApplicationController
 
   hobo_model_controller
 
+  # changes require server restart
   auto_actions :all
 
 end</diff>
      <filename>hobo/rails_generators/hobo_model_resource/templates/controller.rb</filename>
    </modified>
    <modified>
      <diff>@@ -18,9 +18,9 @@ def tag_title(tag, link=false)
     name = tag.attributes['tag']
     anchor = tag_anchor(tag)
   end
-  
+
   title = &quot;&amp;lt;#{name}#{for_decl}&amp;gt;&quot;
-  
+
   if link
     &quot;[#{title}](##{anchor})&quot;
   else
@@ -37,7 +37,7 @@ end
 def tag_anchor(element)
   for_attr = element.attributes['for']
   name = element.attributes['tag']
-  
+
   if for_attr
     &quot;#{name}--for-#{for_attr}&quot;
   else
@@ -47,17 +47,17 @@ end
 
 
 def comment_for_tag(element)
-  space = element.previous_sibling and 
+  space = element.previous_sibling and
     space.to_s.blank? &amp;&amp; space.to_s.count(&quot;\n&quot;) == 1 and
     comment = space.previous_sibling
-  
+
   comment.to_s.strip if comment.is_a?(REXML::Comment)
 end
 
 
 def doc_for_tag(tagdef)
   comment = comment_for_tag(tagdef)
-  
+
   params_merged_with = XPath.first(tagdef, &quot;.//*[@merge|@merge-params]&quot;)._?.name
   params_merged_with &amp;&amp;= &quot;(merged with #{link_to_tag params_merged_with})&quot;
 
@@ -66,7 +66,7 @@ def doc_for_tag(tagdef)
 
   attrs = tagdef.attributes['attrs'] || []
   attrs = attrs.split(/,\s*/).where_not.blank?.map { |a| &quot; * #{a}\n&quot; }.join
-  
+
   parameters = params_to_list(get_parameters(tagdef))
 &lt;&lt;-END
 ---
@@ -113,7 +113,7 @@ def params_to_list(params, indent=&quot; &quot;)
     sub_list = params_to_list(sub_params, indent + ' ') unless sub_params.empty?
     &quot;&lt;li&gt;#{entry}\n#{sub_list}&lt;/li&gt;\n&quot;
   end.join
-  
+
   items.any? ? &quot;&lt;ul&gt;#{items}&lt;/ul&gt;&quot; : &quot;&quot;
 end
 
@@ -125,8 +125,8 @@ end
 
 
 def doc_for_taglib(title, root)
-  tags = XPath.match(root, '/*/def').map { |e| doc_for_tag(e) }.join(&quot;\n\n&quot;)  
-  
+  tags = XPath.match(root, '/*/def').map { |e| doc_for_tag(e) }.join(&quot;\n\n&quot;)
+
   &quot;# #{title}\n\n&quot; + contents(root) + &quot;\n\n&quot; + tags
 end
 
@@ -134,30 +134,30 @@ namespace :hobo do
 
   desc &quot;Generate markdown formatted reference docs automatically from DRYML taglibs&quot;
   task :generate_tag_reference do
-    
+
     src = ENV['src']
-    
+
     output_dir = ENV['output'] || &quot;taglib-docs&quot;
     raise RuntimeError, &quot;#{output_dir} is not a directory&quot; if File.exists?(output_dir) &amp;&amp; !File.directory?(output_dir)
-    
+
     FileUtils.mkdir output_dir unless File.exists? output_dir
-    
+
     dryml_files = File.directory?(src) ? Dir[&quot;#{src}/*&quot;] : [src]
-    
+
     dryml_files.each do |f|
       basename = File.basename(f).sub(/\.dryml$/, '')
       title = basename.titleize
 
       doc = Hobo::Dryml::Parser::Document.new(File.read(f), f)
-    
+
       markdown = doc_for_taglib(title, doc)
       #html = Maruku.new(markdown).to_html
-      
+
       output_file = &quot;#{output_dir}/#{basename}.markdown&quot;
       puts output_file
       File.open(output_file, 'w') { |f| f.write(markdown) }
     end
   end
-  
+
 end
-  
+</diff>
      <filename>hobo/tasks/generate_tag_reference.rb</filename>
    </modified>
    <modified>
      <diff>@@ -2,9 +2,9 @@ namespace :hobo do
 
   desc &quot;Replace commonly used hobo assets with symlinks into the plugin so that they stay up to date&quot;
   task :symlink_assets do
-    
+
     Dir.chdir(&quot;#{RAILS_ROOT}/public&quot;) do
-      Dir.chdir(&quot;javascripts&quot;) do 
+      Dir.chdir(&quot;javascripts&quot;) do
         puts &quot;hobo-rapid.js&quot;
         `rm -f hobo-rapid.js`
         `ln -s ../../vendor/plugins/hobo/rails_generators/hobo_rapid/templates/hobo-rapid.js`
@@ -16,8 +16,8 @@ namespace :hobo do
         `ln -s ../../vendor/plugins/hobo/rails_generators/hobo_rapid/templates/themes/clean/public clean`
       end
     end
-    
+
   end
-  
+
 end
-  
+</diff>
      <filename>hobo/tasks/hobo_tasks.rake</filename>
    </modified>
    <modified>
      <diff>@@ -4,11 +4,11 @@ Template = Hobo::Dryml::Template
 DrymlException = Hobo::Dryml::DrymlException
 
 describe Template do
-  
+
   # --- Tag Compilation Examples --- #
 
   # --- Compilation: Calling Tags --- #
-  
+
   it &quot;should compile tag calls as method calls&quot; do
     compile_dryml(&quot;&lt;foo/&gt;&quot;).should == &quot;&lt;% _output(foo.to_s) %&gt;&quot;
   end
@@ -20,45 +20,45 @@ describe Template do
   it &quot;should compile attributes as keyword parameters&quot; do
     compile_dryml(&quot;&lt;foo a='1' b='2'/&gt;&quot;).should == '&lt;% _output(foo({:a =&gt; &quot;1&quot;, :b =&gt; &quot;2&quot;}, {})) %&gt;'
   end
-  
+
   it &quot;should convert attribute names with dashes in tag calls to symbols with underscores&quot; do
     compile_dryml(&quot;&lt;foo my-attribute='1'/&gt;&quot;).should == &quot;&lt;% _output(foo({:my_attribute =&gt; \&quot;1\&quot;}, {})) %&gt;&quot;
   end
 
-  it &quot;should compile code attributes as ruby code&quot; do 
+  it &quot;should compile code attributes as ruby code&quot; do
     compile_dryml(&quot;&lt;foo a='&amp;1 + 2'/&gt;&quot;).should == '&lt;% _output(foo({:a =&gt; (1 + 2)}, {})) %&gt;'
   end
-  
-  it &quot;should compile attributes with no RHS as passing `true`&quot; do 
+
+  it &quot;should compile attributes with no RHS as passing `true`&quot; do
     compile_dryml(&quot;&lt;foo a/&gt;&quot;).should == '&lt;% _output(foo({:a =&gt; (true)}, {})) %&gt;'
   end
-  
-  it &quot;should compile content of a tag call as the default parameter&quot; do 
+
+  it &quot;should compile content of a tag call as the default parameter&quot; do
     compile_dryml(&quot;&lt;foo&gt;the body&lt;/foo&gt;&quot;).should == &quot;&lt;% _output(foo({}, { :default =&gt; proc { |_foo__default_content| new_context { %&gt;the body&lt;% } }, })) %&gt;&quot;
   end
-  
-  it &quot;should support &lt;param_content/&gt; inside the content of a tag&quot; do 
-    compile_dryml(&quot;&lt;foo&gt;!!&lt;param-content/&gt;??&lt;/foo&gt;&quot;).should == 
+
+  it &quot;should support &lt;param_content/&gt; inside the content of a tag&quot; do
+    compile_dryml(&quot;&lt;foo&gt;!!&lt;param-content/&gt;??&lt;/foo&gt;&quot;).should ==
       &quot;&lt;% _output(foo({}, { :default =&gt; proc { |_foo__default_content| new_context { %&gt;!!&lt;%= _foo__default_content &amp;&amp; _foo__default_content.call %&gt;??&lt;% } }, })) %&gt;&quot;
   end
-  
-  it &quot;should support the 'for' attribute on &lt;param-content/&gt;&quot; do 
-    compile_dryml(&quot;&lt;x&gt;&lt;y&gt;123&lt;param-content for='x'/&gt;456&lt;/y&gt;&lt;/x&gt;&quot;).should == 
+
+  it &quot;should support the 'for' attribute on &lt;param-content/&gt;&quot; do
+    compile_dryml(&quot;&lt;x&gt;&lt;y&gt;123&lt;param-content for='x'/&gt;456&lt;/y&gt;&lt;/x&gt;&quot;).should ==
       &quot;&lt;% _output(x({}, { :default =&gt; proc { |_x__default_content| new_context { %&gt;&lt;% _output(y({}, { :default =&gt; proc { |_y__default_content| new_context { %&gt;&quot; +
       &quot;123&lt;%= _x__default_content &amp;&amp; _x__default_content.call %&gt;456&quot; +
       &quot;&lt;% } }, })) %&gt;&lt;% } }, })) %&gt;&quot;
   end
-  
-  it &quot;should allow :foo as a shorthand for field='foo' on tags&quot; do 
+
+  it &quot;should allow :foo as a shorthand for field='foo' on tags&quot; do
     compile_dryml(&quot;&lt;foo:name/&gt;&quot;).should == '&lt;% _output(foo({:field =&gt; &quot;name&quot;}, {})) %&gt;'
   end
-  
-  it &quot;should allow static tag names like :title as a shorthand for field='title'&quot; do 
+
+  it &quot;should allow static tag names like :title as a shorthand for field='title'&quot; do
     compile_dryml(&quot;&lt;foo:name/&gt;&quot;).should == '&lt;% _output(foo({:field =&gt; &quot;name&quot;}, {})) %&gt;'
   end
-  
-  it &quot;should allow close tags to ommit the :field_name part&quot; do 
-    compile_dryml(&quot;&lt;foo:name&gt;&lt;/foo&gt;&quot;).should == 
+
+  it &quot;should allow close tags to ommit the :field_name part&quot; do
+    compile_dryml(&quot;&lt;foo:name&gt;&lt;/foo&gt;&quot;).should ==
       '&lt;% _output(foo({:field =&gt; &quot;name&quot;}, { :default =&gt; proc { |_foo__default_content| new_context { %&gt;&lt;% } }, })) %&gt;'
   end
 
@@ -66,107 +66,107 @@ describe Template do
     compile_dryml(&quot;&lt;foo merge-attrs/&gt;&quot;).should == &quot;&lt;% _output(foo(merge_attrs({},(attributes) || {}), {})) %&gt;&quot;
     compile_dryml(&quot;&lt;foo a='1' merge-attrs/&gt;&quot;).should == '&lt;% _output(foo(merge_attrs({:a =&gt; &quot;1&quot;},(attributes) || {}), {})) %&gt;'
   end
-  
+
 
   # --- Compilation: Defining Tags --- #
-  
-  it &quot;should compile defs&quot; do 
-    compile_def(&quot;&lt;def tag='foo'&gt;&lt;/def&gt;&quot;).should == 
+
+  it &quot;should compile defs&quot; do
+    compile_def(&quot;&lt;def tag='foo'&gt;&lt;/def&gt;&quot;).should ==
       &quot;&lt;% def foo(all_attributes={}, all_parameters={}); &quot; +
       &quot;parameters = Hobo::Dryml::TagParameters.new(all_parameters, []); &quot; +
       &quot;all_parameters = Hobo::Dryml::TagParameters.new(all_parameters); &quot; +
-      &quot;_tag_context(all_attributes) do attributes, = _tag_locals(all_attributes, []) %&gt;&quot; + 
+      &quot;_tag_context(all_attributes) do attributes, = _tag_locals(all_attributes, []) %&gt;&quot; +
       &quot;&lt;% _erbout; end; end %&gt;&quot;
   end
-  
-  it &quot;should compile attrs in defs as local variables&quot; do 
-    compile_def(&quot;&lt;def tag='foo' attrs='a, my-attr'&gt;&lt;/def&gt;&quot;).should == 
+
+  it &quot;should compile attrs in defs as local variables&quot; do
+    compile_def(&quot;&lt;def tag='foo' attrs='a, my-attr'&gt;&lt;/def&gt;&quot;).should ==
       &quot;&lt;% def foo(all_attributes={}, all_parameters={}); &quot; +
       &quot;parameters = Hobo::Dryml::TagParameters.new(all_parameters, []); &quot; +
       &quot;all_parameters = Hobo::Dryml::TagParameters.new(all_parameters); &quot; +
       &quot;_tag_context(all_attributes) do &quot; +
-      &quot;a, my_attr, attributes, = _tag_locals(all_attributes, [:a, :my_attr]) %&gt;&quot; + 
+      &quot;a, my_attr, attributes, = _tag_locals(all_attributes, [:a, :my_attr]) %&gt;&quot; +
       &quot;&lt;% _erbout; end; end %&gt;&quot;
   end
-    
-  it &quot;should dissallow `param` outside of tag definitions&quot; do 
+
+  it &quot;should dissallow `param` outside of tag definitions&quot; do
     proc { compile_dryml(&quot;&lt;foo param/&gt;&quot;) }.should raise_error(DrymlException)
   end
-  
-  it &quot;should compile param-tag calls as calls to `call_tag_parameter`&quot; do 
+
+  it &quot;should compile param-tag calls as calls to `call_tag_parameter`&quot; do
     compile_in_template(&quot;&lt;foo param a='1'/&gt;&quot;).should == '&lt;% _output(call_tag_parameter(:foo, {:a =&gt; &quot;1&quot;}, {}, all_parameters, :foo)) %&gt;'
   end
-  
-  it &quot;should compile with support for named params&quot; do 
+
+  it &quot;should compile with support for named params&quot; do
     compile_in_template(&quot;&lt;foo param='zap'/&gt;&quot;).should == &quot;&lt;% _output(call_tag_parameter(:foo, {}, {}, all_parameters, :zap)) %&gt;&quot;
   end
 
   it &quot;should compile a param tag-call with a body&quot; do
-    compile_in_template(&quot;&lt;foo param&gt;abc&lt;/foo&gt;&quot;).should == 
+    compile_in_template(&quot;&lt;foo param&gt;abc&lt;/foo&gt;&quot;).should ==
       &quot;&lt;% _output(call_tag_parameter(:foo, {}, { :default =&gt; proc { |_foo__default_content| new_context { %&gt;abc&lt;% } }, }, all_parameters, :foo)) %&gt;&quot;
   end
-  
-  it &quot;should compile a param tag-call with a body and a call to &lt;param_content/&gt;&quot; do 
-    compile_in_template(&quot;&lt;foo param&gt;!!&lt;param-content/&gt;!!&lt;/foo&gt;&quot;).should == 
+
+  it &quot;should compile a param tag-call with a body and a call to &lt;param_content/&gt;&quot; do
+    compile_in_template(&quot;&lt;foo param&gt;!!&lt;param-content/&gt;!!&lt;/foo&gt;&quot;).should ==
       &quot;&lt;% _output(call_tag_parameter(:foo, {}, { :default =&gt; proc { |_foo__default_content| new_context { %&gt;!!&lt;%= _foo__default_content &amp;&amp; _foo__default_content.call %&gt;!!&lt;% } }, }, all_parameters, :foo)) %&gt;&quot;
   end
 
-  it &quot;should compile param template-calls as calls to `call_tag_parameter`&quot; do 
-    compile_in_template(&quot;&lt;foo param/&gt;&quot;).should == 
+  it &quot;should compile param template-calls as calls to `call_tag_parameter`&quot; do
+    compile_in_template(&quot;&lt;foo param/&gt;&quot;).should ==
       &quot;&lt;% _output(call_tag_parameter(:foo, {}, {}, all_parameters, :foo)) %&gt;&quot;
   end
-  
-  it &quot;should compile param tag calls with parameters as calls to `call_tag_parameter`&quot; do 
-    compile_in_template(&quot;&lt;foo param&gt;&lt;a: x='1'/&gt;&lt;/foo&gt;&quot;).should == 
+
+  it &quot;should compile param tag calls with parameters as calls to `call_tag_parameter`&quot; do
+    compile_in_template(&quot;&lt;foo param&gt;&lt;a: x='1'/&gt;&lt;/foo&gt;&quot;).should ==
       '&lt;% _output(call_tag_parameter(:foo, {}, {:a =&gt; proc { [{:x =&gt; &quot;1&quot;}, {}] }, }, all_parameters, :foo)) %&gt;'
   end
-  
+
   it &quot;should compile parameters with param&quot; do
-    compile_in_template(&quot;&lt;foo&gt;&lt;abc: param/&gt;&lt;/foo&gt;&quot;).should == 
+    compile_in_template(&quot;&lt;foo&gt;&lt;abc: param/&gt;&lt;/foo&gt;&quot;).should ==
       '&lt;% _output(foo({}, {:abc =&gt; merge_tag_parameter(proc { [{}, {}] }, all_parameters[:abc]), })) %&gt;'
   end
-  
+
   it &quot;should compile tag parameters with named params&quot; do
-    compile_in_template(&quot;&lt;foo&gt;&lt;abc: param='x'/&gt;&lt;/foo&gt;&quot;).should == 
+    compile_in_template(&quot;&lt;foo&gt;&lt;abc: param='x'/&gt;&lt;/foo&gt;&quot;).should ==
       '&lt;% _output(foo({}, {:abc =&gt; merge_tag_parameter(proc { [{}, {}] }, all_parameters[:x]), })) %&gt;'
   end
-  
+
   it &quot;should compile tag parameters with param and attributes&quot; do
-    compile_in_template(&quot;&lt;foo&gt;&lt;abc: param='x' a='b'/&gt;&lt;/foo&gt;&quot;).should == 
+    compile_in_template(&quot;&lt;foo&gt;&lt;abc: param='x' a='b'/&gt;&lt;/foo&gt;&quot;).should ==
       '&lt;% _output(foo({}, {:abc =&gt; merge_tag_parameter(proc { [{:a =&gt; &quot;b&quot;}, {}] }, all_parameters[:x]), })) %&gt;'
   end
-  
+
   it &quot;should compile tag parameters with param and a tag body&quot; do
-    compile_in_template(&quot;&lt;foo&gt;&lt;abc: param&gt;ha!&lt;/abc&gt;&lt;/foo&gt;&quot;).should == 
+    compile_in_template(&quot;&lt;foo&gt;&lt;abc: param&gt;ha!&lt;/abc&gt;&lt;/foo&gt;&quot;).should ==
       '&lt;% _output(foo({}, {:abc =&gt; merge_tag_parameter(' +
       'proc { [{}, { :default =&gt; proc { |_abc__default_content| new_context { %&gt;ha!&lt;% } }, }] }, all_parameters[:abc]), })) %&gt;'
   end
-  
-  it &quot;should compile tag parameters with param and nested parameters&quot; do 
-    compile_in_template(&quot;&lt;foo&gt;&lt;baa: param&gt;&lt;x:&gt;hello&lt;/x:&gt;&lt;/baa:&gt;&lt;/foo&gt;&quot;).should == 
+
+  it &quot;should compile tag parameters with param and nested parameters&quot; do
+    compile_in_template(&quot;&lt;foo&gt;&lt;baa: param&gt;&lt;x:&gt;hello&lt;/x:&gt;&lt;/baa:&gt;&lt;/foo&gt;&quot;).should ==
       '&lt;% _output(foo({}, {:baa =&gt; merge_tag_parameter(' +
       'proc { [{}, {:x =&gt; proc { [{}, { :default =&gt; proc { |_x__default_content| new_context { %&gt;hello&lt;% } }, }] }, }] }, all_parameters[:baa]), })) %&gt;'
   end
 
-  # --- Compilation: Calling tags with parameters --- # 
-  
-  it &quot;should compile tag parameters as procs&quot; do 
+  # --- Compilation: Calling tags with parameters --- #
+
+  it &quot;should compile tag parameters as procs&quot; do
     compile_dryml(&quot;&lt;foo&gt;&lt;x:&gt;hello&lt;/x&gt;&lt;y:&gt;world&lt;/y:&gt;&lt;/foo&gt;&quot;).should ==
-      '&lt;% _output(foo({}, {' + 
+      '&lt;% _output(foo({}, {' +
       ':x =&gt; proc { [{}, { :default =&gt; proc { |_x__default_content| new_context { %&gt;hello&lt;% } }, }] }, ' +
       ':y =&gt; proc { [{}, { :default =&gt; proc { |_y__default_content| new_context { %&gt;world&lt;% } }, }] }, })) %&gt;'
   end
-  
+
   it &quot;should compile tag parameters with attributes&quot; do
     compile_dryml(&quot;&lt;foo&gt;&lt;abc: x='1'&gt;hello&lt;/abc&gt;&lt;/foo&gt;&quot;).should ==
       '&lt;% _output(foo({}, {:abc =&gt; proc { [{:x =&gt; &quot;1&quot;}, { :default =&gt; proc { |_abc__default_content| new_context { %&gt;hello&lt;% } }, }] }, })) %&gt;'
   end
-  
-  it &quot;should allow :foo as a shorthand for field='foo' on template tags&quot; do 
+
+  it &quot;should allow :foo as a shorthand for field='foo' on template tags&quot; do
     compile_dryml(&quot;&lt;foo:name/&gt;&quot;).should == '&lt;% _output(foo({:field =&gt; &quot;name&quot;}, {})) %&gt;'
   end
-  
-  it &quot;should compile template parameters which are themselves templates&quot; do 
+
+  it &quot;should compile template parameters which are themselves templates&quot; do
     # Tag parameters with nested tag parameters are procs that return
     # a pair of hashes, the first is the attributes, the second is the
     # sub-template procs
@@ -179,92 +179,92 @@ describe Template do
     # A replace parameter is detected at runtime by the arity of the
     # block == 1 (for a normal parameter it would be 0). See
     # TemplateEnvironment#call_tag_parameter
-    compile_dryml(&quot;&lt;page&gt;&lt;head: replace&gt;abc&lt;/head&gt;&lt;/page&gt;&quot;).should == 
+    compile_dryml(&quot;&lt;page&gt;&lt;head: replace&gt;abc&lt;/head&gt;&lt;/page&gt;&quot;).should ==
       '&lt;% _output(page({}, {:head_replacement =&gt; proc { |_head_restore| new_context { %&gt;abc&lt;% } }, })) %&gt;'
   end
-    
+
   it &quot;should compile 'replace' parameters where the restore contains a default parameter call&quot; do
-    compile_dryml(&quot;&lt;page&gt;&lt;head: replace&gt;abc &lt;head restore&gt;blah&lt;/head&gt;&lt;/head&gt;&lt;/page&gt;&quot;).should == 
-      
+    compile_dryml(&quot;&lt;page&gt;&lt;head: replace&gt;abc &lt;head restore&gt;blah&lt;/head&gt;&lt;/head&gt;&lt;/page&gt;&quot;).should ==
+
       '&lt;% _output(page({}, {:head_replacement =&gt; proc { |_head_restore| new_context { %&gt;abc ' +
       '&lt;% _output(_head_restore.call({}, { :default =&gt; proc { |_head__default_content| new_context { %&gt;blah&lt;% } }, })) %&gt;' +
       '&lt;% } }, })) %&gt;'
   end
-  
+
   it &quot;should compile 'replace' tag parameters with a default parameter call&quot; do
-    compile_dryml(&quot;&lt;page&gt;&lt;head: replace&gt;abc &lt;head restore/&gt;&lt;/head&gt;&lt;/page&gt;&quot;).should == 
-      
+    compile_dryml(&quot;&lt;page&gt;&lt;head: replace&gt;abc &lt;head restore/&gt;&lt;/head&gt;&lt;/page&gt;&quot;).should ==
+
       '&lt;% _output(page({}, {:head_replacement =&gt; proc { |_head_restore| new_context { %&gt;abc ' +
       '&lt;% _output(_head_restore.call({}, {})) %&gt;' +
       '&lt;% } }, })) %&gt;'
   end
-  
-  
+
+
   # --- Compilation: Syntax sugar for before, after, append, prepend --- #
-  
+
   it &quot;should compile 'before' parameters&quot; do
-    compile_dryml(&quot;&lt;page&gt;&lt;before-head:&gt;abc&lt;/before-head&gt;&lt;/page&gt;&quot;).should == 
-      
+    compile_dryml(&quot;&lt;page&gt;&lt;before-head:&gt;abc&lt;/before-head&gt;&lt;/page&gt;&quot;).should ==
+
       '&lt;% _output(page({}, {:head_replacement =&gt; proc { |_head_restore| new_context { %&gt;abc' +
       '&lt;% _output(_head_restore.call({}, {})) %&gt;' +
       '&lt;% } }, })) %&gt;'
   end
-  
+
   it &quot;should compile 'after' parameters&quot; do
-    compile_dryml(&quot;&lt;page&gt;&lt;after-head:&gt;abc&lt;/after-head&gt;&lt;/page&gt;&quot;).should == 
-      
+    compile_dryml(&quot;&lt;page&gt;&lt;after-head:&gt;abc&lt;/after-head&gt;&lt;/page&gt;&quot;).should ==
+
       '&lt;% _output(page({}, {:head_replacement =&gt; proc { |_head_restore| new_context { %&gt;' +
       '&lt;% _output(_head_restore.call({}, {})) %&gt;' +
       'abc&lt;% } }, })) %&gt;'
   end
-  
+
   it &quot;should compile 'apppend' parameters&quot; do
-    compile_dryml(&quot;&lt;page&gt;&lt;append-head:&gt;:o)&lt;/append-head&gt;&lt;/page&gt;&quot;).should == 
-      
-      '&lt;% _output(page({}, {:head =&gt; proc { [{}, { :default =&gt; proc { |_head__default_content| new_context { %&gt;' + 
+    compile_dryml(&quot;&lt;page&gt;&lt;append-head:&gt;:o)&lt;/append-head&gt;&lt;/page&gt;&quot;).should ==
+
+      '&lt;% _output(page({}, {:head =&gt; proc { [{}, { :default =&gt; proc { |_head__default_content| new_context { %&gt;' +
       '&lt;%= _head__default_content &amp;&amp; _head__default_content.call %&gt;:o)' +
       '&lt;% } } } ] }, })) %&gt;'
   end
 
   it &quot;should compile 'prepend' parameters&quot; do
-    compile_dryml(&quot;&lt;page&gt;&lt;prepend-head:&gt;:o)&lt;/prepend-head&gt;&lt;/page&gt;&quot;).should == 
-      
-      '&lt;% _output(page({}, {:head =&gt; proc { [{}, { :default =&gt; proc { |_head__default_content| new_context { %&gt;' + 
+    compile_dryml(&quot;&lt;page&gt;&lt;prepend-head:&gt;:o)&lt;/prepend-head&gt;&lt;/page&gt;&quot;).should ==
+
+      '&lt;% _output(page({}, {:head =&gt; proc { [{}, { :default =&gt; proc { |_head__default_content| new_context { %&gt;' +
       ':o)&lt;%= _head__default_content &amp;&amp; _head__default_content.call %&gt;' +
       '&lt;% } } } ] }, })) %&gt;'
   end
 
   # --- Tag Evalutation Examples --- #
-  
-  
+
+
   # --- Static Tags --- #
-  
+
   it &quot;should pass through tags declared as static&quot; do
     &quot;p&quot;.should be_in(Hobo.static_tags)
     eval_dryml(&quot;&lt;p&gt;abc&lt;/p&gt;&quot;).should == &quot;&lt;p&gt;abc&lt;/p&gt;&quot;
     eval_dryml(&quot;&lt;p x='1'   y='2'&gt;abc&lt;/p&gt;&quot;).should == &quot;&lt;p x='1'   y='2'&gt;abc&lt;/p&gt;&quot;
   end
-  
-  it &quot;should pass through attributes with no rhs on static tags&quot; do 
+
+  it &quot;should pass through attributes with no rhs on static tags&quot; do
     &quot;p&quot;.should be_in(Hobo.static_tags)
-    eval_dryml(&quot;&lt;p foo baa&gt;abc&lt;/p&gt;&quot;).should == &quot;&lt;p foo baa&gt;abc&lt;/p&gt;&quot;    
+    eval_dryml(&quot;&lt;p foo baa&gt;abc&lt;/p&gt;&quot;).should == &quot;&lt;p foo baa&gt;abc&lt;/p&gt;&quot;
   end
-  
-  it &quot;should support attribute merging on static tags&quot; do 
+
+  it &quot;should support attribute merging on static tags&quot; do
     eval_dryml(%(&lt;p class=&quot;big&quot; id=&quot;x&quot; merge-attrs=&quot;&amp;{:class =&gt; 'small', :id =&gt; 'y', :a =&gt; 'b'}&quot;/&gt;)).
       should be_dom_equal_to('&lt;p class=&quot;big small&quot; id=&quot;y&quot; a=&quot;b&quot;/&gt;')
   end
-  
-  it &quot;should support attribute merging of all extra attributes on static tags&quot; do 
+
+  it &quot;should support attribute merging of all extra attributes on static tags&quot; do
     eval_dryml(%(&lt;def tag=&quot;x&quot;&gt;&lt;p class=&quot;big&quot; id=&quot;x&quot; merge-attrs/&gt;&lt;/def&gt;
                  &lt;x class='small' id='y' a='b'/&gt;)).
       should be_dom_equal_to('&lt;p class=&quot;big small&quot; id=&quot;y&quot; a=&quot;b&quot;/&gt;')
   end
-  
-  
+
+
   # --- Tags without named parameters --- #
-  
-  
+
+
   def eval_with_defs(dryml)
     eval_dryml(&lt;&lt;-END + dryml).strip
       &lt;def tag=&quot;do&quot;&gt;&lt;%= parameters.default %&gt;&lt;/def&gt;
@@ -279,43 +279,43 @@ describe Template do
     END
   end
 
-  it &quot;should call tags&quot; do 
+  it &quot;should call tags&quot; do
     eval_with_defs(&quot;&lt;t/&gt;&quot;).should == &quot;plain tag&quot;
   end
-    
+
 
   it &quot;should call tags passing attributes&quot; do
     eval_with_defs(&quot;&lt;t-attr my-attr='10'/&gt;&quot;).should == &quot;it is 10&quot;
   end
-  
+
   it &quot;should call tags with content (default parameter)&quot; do
     eval_with_defs(&quot;&lt;t-body&gt;foo&lt;/t-body&gt;&quot;).should == &quot;( foo )&quot;
   end
-  
+
   it &quot;should allow parameters to have a default&quot; do
     eval_with_defs(&quot;&lt;t-body/&gt;&quot;).should == &quot;( hmm )&quot;
   end
-  
+
   it &quot;should provide access to the default parameter content&quot; do
     eval_with_defs(&quot;&lt;t-body&gt;[&lt;param-content/&gt;]&lt;/t-body&gt;&quot;).should == &quot;( [hmm] )&quot;
   end
-  
-  it &quot;should support merge-attrs on static tags&quot; do 
+
+  it &quot;should support merge-attrs on static tags&quot; do
     eval_with_defs('&lt;merge-attrs-example class=&quot;x&quot;/&gt;').should == '&lt;p class=&quot;x&quot;&gt;hi&lt;/p&gt;'
   end
-  
-  it &quot;should make the declared attributes available via the 'attrs-for' method&quot; do 
+
+  it &quot;should make the declared attributes available via the 'attrs-for' method&quot; do
     eval_with_defs('&lt;%= attrs_for(:t_attr).inspect %&gt;').should == '[:my_attr]'
   end
-  
+
   it &quot;should allow undeclared attributes to be extracted from 'attributes'&quot; do
     eval_dryml(&quot;&lt;def tag='t'&gt;&lt;%= attributes[:my_attribute] %&gt;&lt;/def&gt;&lt;t my-attribute='123'/&gt;&quot;).should == &quot;123&quot;
   end
-  
-  
-  
+
+
+
   # --- Parameters --- #
-  
+
   def eval_with_templates(dryml)
     eval_dryml(&lt;&lt;-END + dryml).strip
       &lt;def tag=&quot;do&quot;&gt;&lt;%= parameters.default %&gt;&lt;/def&gt;
@@ -336,83 +336,83 @@ describe Template do
     END
   end
 
-  it &quot;should add attributes to static tags when merging&quot; do 
-    eval_with_templates(&quot;&lt;static-merge&gt;&lt;b: onclick='alert()'/&gt;&lt;/static-merge&gt;&quot;).should == 
-      '&lt;p&gt;a &lt;b name=&quot;big&quot; onclick=&quot;alert()&quot;&gt;bold&lt;/b&gt; word&lt;/p&gt;'    
+  it &quot;should add attributes to static tags when merging&quot; do
+    eval_with_templates(&quot;&lt;static-merge&gt;&lt;b: onclick='alert()'/&gt;&lt;/static-merge&gt;&quot;).should ==
+      '&lt;p&gt;a &lt;b name=&quot;big&quot; onclick=&quot;alert()&quot;&gt;bold&lt;/b&gt; word&lt;/p&gt;'
   end
-  
-  it &quot;should override attributes on static tags when merging&quot; do 
-    eval_with_templates(&quot;&lt;static-merge&gt;&lt;b: name='small'/&gt;&lt;/static-merge&gt;&quot;).should == 
+
+  it &quot;should override attributes on static tags when merging&quot; do
+    eval_with_templates(&quot;&lt;static-merge&gt;&lt;b: name='small'/&gt;&lt;/static-merge&gt;&quot;).should ==
       '&lt;p&gt;a &lt;b name=&quot;small&quot;&gt;bold&lt;/b&gt; word&lt;/p&gt;'
   end
-  
+
   it &quot;should replace tag bodies on static tags when merging&quot; do
-    eval_with_templates('&lt;static-merge&gt;&lt;b:&gt;BOLD&lt;/b&gt;&lt;/static-merge&gt;').should == 
+    eval_with_templates('&lt;static-merge&gt;&lt;b:&gt;BOLD&lt;/b&gt;&lt;/static-merge&gt;').should ==
       '&lt;p&gt;a &lt;b name=&quot;big&quot;&gt;BOLD&lt;/b&gt; word&lt;/p&gt;'
   end
-  
-  it &quot;should add attributes to defined tags when merging&quot; do 
+
+  it &quot;should add attributes to defined tags when merging&quot; do
     eval_with_templates('&lt;def-tag-merge&gt;&lt;defined: a=&quot;2&quot;/&gt;&lt;/def-tag-merge&gt;').should ==
       'foo a is 2, b is 3, body is baa!'
   end
-  
-  it &quot;should override attributes on defined tags when merging&quot; do 
+
+  it &quot;should override attributes on defined tags when merging&quot; do
     eval_with_templates('&lt;def-tag-merge&gt;&lt;defined: b=&quot;2&quot;/&gt;&lt;/def-tag-merge&gt;').should ==
       'foo a is , b is 2, body is baa!'
   end
-  
-  it &quot;should replace tag bodies on defined tags when merging&quot; do 
+
+  it &quot;should replace tag bodies on defined tags when merging&quot; do
     eval_with_templates('&lt;def-tag-merge&gt;&lt;defined:&gt;zip&lt;/defined&gt;&lt;/def-tag-merge&gt;').should ==
       'foo a is , b is 3, body is zip!'
   end
-  
+
   it &quot;should leave non-merged tags unchanged&quot; do
     eval_with_templates('&lt;static-merge&gt;&lt;/static-merge&gt;').should ==
       '&lt;p&gt;a &lt;b name=&quot;big&quot;&gt;bold&lt;/b&gt; word&lt;/p&gt;'
   end
-  
+
   it &quot;should merge into static tags with no body&quot; do
-    eval_with_templates(&quot;&lt;empty-static-merge&gt;&lt;img: name='small'/&gt;&lt;/empty-static-merge&gt;&quot;).should == 
+    eval_with_templates(&quot;&lt;empty-static-merge&gt;&lt;img: name='small'/&gt;&lt;/empty-static-merge&gt;&quot;).should ==
       '&lt;img name=&quot;small&quot; src=&quot;...&quot; /&gt;'
   end
-    
-  it &quot;should merge template parameters into nested templates&quot; do 
+
+  it &quot;should merge template parameters into nested templates&quot; do
     eval_with_templates('&lt;nested-static-merge&gt;&lt;static-merge:&gt;&lt;b: name=&quot;small&quot;/&gt;&lt;/static-merge&gt;&lt;/nested-static-merge&gt;').should ==
       'merge StaticMerge: &lt;p&gt;a &lt;b name=&quot;small&quot;&gt;bold&lt;/b&gt; word&lt;/p&gt;'
   end
-  
-  it &quot;should merge the body of template parameters into nested templates&quot; do 
+
+  it &quot;should merge the body of template parameters into nested templates&quot; do
     eval_with_templates('&lt;nested-static-merge&gt;&lt;static-merge:&gt;&lt;b:&gt;BOLD&lt;/b&gt;&lt;/static-merge&gt;&lt;/nested-static-merge&gt;').should ==
       'merge StaticMerge: &lt;p&gt;a &lt;b name=&quot;big&quot;&gt;BOLD&lt;/b&gt; word&lt;/p&gt;'
   end
-  
-  it &quot;should allow param names to be defined dynamically&quot; do 
+
+  it &quot;should allow param names to be defined dynamically&quot; do
     eval_dryml('&lt;def tag=&quot;t&quot;&gt;&lt;p param=&quot;&amp; :a.to_s + :b.to_s&quot;/&gt;&lt;/def&gt;' +
                '&lt;t&gt;&lt;ab: x=&quot;1&quot;/&gt;&lt;/t&gt;').should == '&lt;p x=&quot;1&quot; /&gt;'
   end
-  
-  it &quot;should allow params to be defined on other params&quot; do 
-    eval_with_templates('&lt;parameter-merge&gt;&lt;b: name=&quot;small&quot;&gt;foo&lt;/b&gt;&lt;/parameter-merge&gt;').should == 
+
+  it &quot;should allow params to be defined on other params&quot; do
+    eval_with_templates('&lt;parameter-merge&gt;&lt;b: name=&quot;small&quot;&gt;foo&lt;/b&gt;&lt;/parameter-merge&gt;').should ==
       'parameter merge: &lt;p&gt;a &lt;b name=&quot;small&quot;&gt;foo&lt;/b&gt; word&lt;/p&gt;'
   end
-  
-  it &quot;should allow parameter bodies to be restored with static tag params&quot; do 
+
+  it &quot;should allow parameter bodies to be restored with static tag params&quot; do
     eval_with_templates(&quot;&lt;static-merge&gt;&lt;b:&gt;very &lt;param-content/&gt;&lt;/b&gt;&lt;/static-merge&gt;&quot;).should ==
       '&lt;p&gt;a &lt;b name=&quot;big&quot;&gt;very bold&lt;/b&gt; word&lt;/p&gt;'
   end
 
-  it &quot;should allow parameter bodies to be restored with defined tag params&quot; do 
+  it &quot;should allow parameter bodies to be restored with defined tag params&quot; do
     eval_with_templates(&quot;&lt;def-tag-merge&gt;&lt;defined:&gt;hum&lt;param-content/&gt;&lt;/defined&gt;&lt;/def-tag-merge&gt;&quot;).should ==
       'foo a is , b is 3, body is humbaa!'
   end
 
-  it &quot;should insert the correct param-content in nested merged template parameters&quot; do 
+  it &quot;should insert the correct param-content in nested merged template parameters&quot; do
     eval_dryml(&quot;&lt;def tag='t1'&gt;&lt;p param&gt;t1 default&lt;/p&gt;&lt;/def&gt;&quot; +
                &quot;&lt;def tag='t2'&gt;&lt;t1 merge&gt;&lt;p: param&gt;&lt;param-content/&gt; - t2 default&lt;/p&gt;&lt;/t1&gt;&lt;/def&gt;&quot; +
                &quot;&lt;t2&gt;&lt;p:&gt;&lt;param-content/&gt;!&lt;/p&gt;&lt;/t2&gt;&quot;).should == &quot;&lt;p&gt;t1 default - t2 default!&lt;/p&gt;&quot;
   end
-  
-  it &quot;should accumulate attributes through nested merged template parameters&quot; do 
+
+  it &quot;should accumulate attributes through nested merged template parameters&quot; do
     eval_dryml(&quot;&lt;def tag='t1'&gt;&lt;p: class='c1' c='c' param/&gt;&lt;/def&gt;&quot; +
                &quot;&lt;def tag='t2'&gt;&lt;t1: merge/&gt;&lt;/def&gt;&quot; +
                &quot;&lt;def tag='t3'&gt;&lt;t2: merge&gt;&lt;p: class='c2' b='b' param/&gt;&lt;/t2&gt;&lt;/def&gt;&quot; +
@@ -420,34 +420,34 @@ describe Template do
   end
 
   # --- Replacing Parameters --- #
-  
-  it &quot;should allow template parameters to be replaced&quot; do 
+
+  it &quot;should allow template parameters to be replaced&quot; do
     eval_with_templates('&lt;static-merge&gt;&lt;b: replace&gt;short&lt;/b&gt;&lt;/static-merge&gt;').should ==
       '&lt;p&gt;a short word&lt;/p&gt;'
   end
-  
-  it &quot;should allow template parameters to be replaced and then re-instated&quot; do 
+
+  it &quot;should allow template parameters to be replaced and then re-instated&quot; do
     eval_with_templates('&lt;nested-static-merge&gt;&lt;static-merge: replace&gt;Come back: &lt;static-merge restore/&gt;&lt;/static-merge&gt;&lt;/nested-static-merge&gt;').should ==
       'merge StaticMerge: Come back: &lt;p&gt;a &lt;b name=&quot;big&quot;&gt;bold&lt;/b&gt; word&lt;/p&gt;'
   end
 
-  it &quot;should allow template parameters to be replaced and then re-instated with different attributes&quot; do 
+  it &quot;should allow template parameters to be replaced and then re-instated with different attributes&quot; do
     eval_with_templates('&lt;static-merge&gt;&lt;b: replace&gt;short &lt;b restore name=&quot;small&quot;/&gt;&lt;/b&gt;&lt;/static-merge&gt;').should ==
       '&lt;p&gt;a short &lt;b name=&quot;small&quot;&gt;bold&lt;/b&gt; word&lt;/p&gt;'
   end
 
-  it &quot;should allow template parameters to be replaced and then re-instated with different content&quot; do 
+  it &quot;should allow template parameters to be replaced and then re-instated with different content&quot; do
     eval_with_templates('&lt;static-merge&gt;&lt;b: replace&gt;short &lt;b restore&gt;big&lt;/b&gt;&lt;/b&gt;&lt;/static-merge&gt;').should ==
       '&lt;p&gt;a short &lt;b name=&quot;big&quot;&gt;big&lt;/b&gt; word&lt;/p&gt;'
   end
-  
+
   it &quot;should allow restored parameters to themselves be parameters&quot; do
     eval_with_templates('&lt;def tag=&quot;restore-param&quot;&gt;&lt;static-merge&gt;&lt;b: replace&gt;short &lt;b restore param&gt;big&lt;/b&gt;&lt;/b&gt;&lt;/static-merge&gt;&lt;/def&gt;' +
                         '&lt;restore-param&gt;&lt;b:&gt;very big&lt;/b:&gt;&lt;/restore-param&gt;').
       should == '&lt;p&gt;a short &lt;b name=&quot;big&quot;&gt;very big&lt;/b&gt; word&lt;/p&gt;'
   end
 
-  it &quot;should restore overridden parameters&quot; do 
+  it &quot;should restore overridden parameters&quot; do
     eval_dryml(%(
       &lt;def tag='foo'&gt;&lt;parameters.default/&gt;&lt;/def&gt;
       &lt;def tag='one'&gt;&lt;foo param&gt;a heading&lt;/foo&gt;&lt;/def&gt;
@@ -455,50 +455,50 @@ describe Template do
       &lt;two&gt;&lt;foo: replace&gt;&lt;foo restore/&gt;&lt;/foo:&gt;&lt;/two&gt;
     )).should == &quot;new heading&quot;
   end
-  
-  it &quot;should restore overridden parameters on static tags&quot; do 
+
+  it &quot;should restore overridden parameters on static tags&quot; do
     eval_dryml(%(
       &lt;def tag='one'&gt;&lt;h1 param&gt;a heading&lt;/h1&gt;&lt;/def&gt;
       &lt;def tag='two'&gt;&lt;one merge&gt;&lt;h1: param&gt;new heading&lt;/h1:&gt;&lt;/one&gt;&lt;/def&gt;
       &lt;two&gt;&lt;h1: replace&gt;&lt;h1 restore/&gt;&lt;/h1:&gt;&lt;/two&gt;
     )).should == &quot;&lt;h1&gt;new heading&lt;/h1&gt;&quot;
   end
-  
+
   # --- Append, Prepend, Before &amp; After --- #
 
-  it &quot;should allow content to be inserted before template parameters&quot; do 
+  it &quot;should allow content to be inserted before template parameters&quot; do
     eval_with_templates('&lt;static-merge&gt;&lt;before-b:&gt;:o)&lt;/before-b&gt;&lt;/static-merge&gt;').should ==
       '&lt;p&gt;a :o)&lt;b name=&quot;big&quot;&gt;bold&lt;/b&gt; word&lt;/p&gt;'
   end
-  
-  it &quot;should allow content to be inserted after template parameters&quot; do 
+
+  it &quot;should allow content to be inserted after template parameters&quot; do
     eval_with_templates('&lt;static-merge&gt;&lt;after-b:&gt;:o)&lt;/after-b&gt;&lt;/static-merge&gt;').should ==
       '&lt;p&gt;a &lt;b name=&quot;big&quot;&gt;bold&lt;/b&gt;:o) word&lt;/p&gt;'
   end
-  
-  it &quot;should allow content to be prepended to the content of template parameters&quot; do 
+
+  it &quot;should allow content to be prepended to the content of template parameters&quot; do
     eval_with_templates('&lt;static-merge&gt;&lt;prepend-b:&gt;:o)&lt;/prepend-b&gt;&lt;/static-merge&gt;').should ==
       '&lt;p&gt;a &lt;b name=&quot;big&quot;&gt;:o)bold&lt;/b&gt; word&lt;/p&gt;'
   end
 
-  it &quot;should allow content to be appended to the content of template parameters&quot; do 
+  it &quot;should allow content to be appended to the content of template parameters&quot; do
     eval_with_templates('&lt;static-merge&gt;&lt;append-b:&gt;:o)&lt;/append-b&gt;&lt;/static-merge&gt;').should ==
       '&lt;p&gt;a &lt;b name=&quot;big&quot;&gt;bold:o)&lt;/b&gt; word&lt;/p&gt;'
   end
-  
+
   # --- Merge Params --- #
-  
-  
+
+
   it &quot;should support merge_param on template calls&quot; do
     tags = %(&lt;def tag=&quot;page&quot;&gt;&lt;h1 param='title'/&gt;&lt;div param='footer'/&gt;&lt;/def&gt;
              &lt;def tag=&quot;my-page&quot;&gt;&lt;page merge-params&gt;&lt;footer:&gt;the footer&lt;/footer&gt;&lt;/page&gt;&lt;/def&gt;)
 
     eval_dryml(tags + &quot;&lt;my-page&gt;&lt;title:&gt;Hi!&lt;/title&gt;&lt;/my-page&gt;&quot;).should == '&lt;h1&gt;Hi!&lt;/h1&gt;&lt;div&gt;the footer&lt;/div&gt;'
   end
-  
-  
+
+
   # --- Polymorphic Tags --- #
-  
+
   it &quot;should allow tags to be selected based on types&quot; do
     tags = %(&lt;def tag=&quot;do&quot;&gt;&lt;%= parameters.default %&gt;&lt;/def&gt;
              &lt;def tag=&quot;t&quot; for=&quot;string&quot;&gt;A string&lt;/def&gt;
@@ -507,124 +507,124 @@ describe Template do
     eval_dryml(tags + '&lt;do with=&quot;&amp;\'foo\'&quot;&gt;&lt;%= call_polymorphic_tag(:t) %&gt;&lt;/do&gt;').should == &quot;A string&quot;
     eval_dryml(tags + '&lt;do with=&quot;&amp;false&quot;&gt;&lt;%= call_polymorphic_tag(:t) %&gt;&lt;/do&gt;').should == &quot;A boolean&quot;
   end
-  
+
   # --- The Context --- #
-  
+
   def context_eval(context, src)
     eval_dryml(src, :context =&gt; context)
   end
-  
+
   def a_user
     Struct.new(:name, :email).new(&quot;Tom&quot;, &quot;tom@foo.net&quot;)
   end
-  
+
   def show_tag
     '&lt;def tag=&quot;show&quot;&gt;&lt;%= this %&gt;&lt;/def&gt;'
   end
-  
-  it &quot;should make the initial context available as `this`&quot;  do 
+
+  it &quot;should make the initial context available as `this`&quot;  do
     context_eval('hello', &quot;&lt;%= this %&gt;&quot;).should == &quot;hello&quot;
   end
-  
-  it &quot;should allow the context to be changed with the :&lt;field-name&gt; syntax&quot; do 
+
+  it &quot;should allow the context to be changed with the :&lt;field-name&gt; syntax&quot; do
     context_eval(a_user, show_tag + '&lt;show:name/&gt;').should == &quot;Tom&quot;
   end
-  
-  it &quot;should allow the :&lt;field-name&gt; to be ommitted from the close tag&quot; do 
+
+  it &quot;should allow the :&lt;field-name&gt; to be ommitted from the close tag&quot; do
     context_eval(a_user, show_tag + '&lt;show:name&gt;&lt;/show:name&gt;').should == &quot;Tom&quot;
     context_eval(a_user, show_tag + '&lt;show:name&gt;&lt;/show&gt;').should == &quot;Tom&quot;
   end
-  
-  
-  it &quot;should allow the context to be changed with a 'with' attribute&quot; do 
+
+
+  it &quot;should allow the context to be changed with a 'with' attribute&quot; do
     eval_dryml(show_tag + %(&lt;show with=&quot;&amp;'hello'&quot;/&gt;)).should == 'hello'
   end
-  
-  it &quot;should allow the context to be changed with a 'field' attribute&quot; do 
+
+  it &quot;should allow the context to be changed with a 'field' attribute&quot; do
     context_eval(a_user, show_tag + '&lt;show field=&quot;name&quot;/&gt;').should == &quot;Tom&quot;
   end
-  
-  it &quot;should allow the context to be changed inside template parameters&quot; do 
+
+  it &quot;should allow the context to be changed inside template parameters&quot; do
     tags = %(&lt;def tag=&quot;do&quot;&gt;&lt;%= parameters.default %&gt;&lt;/def&gt;
              &lt;def tag=&quot;template&quot;&gt;&lt;do:name&gt;&lt;p param/&gt;&lt;/do&gt;&lt;/def&gt;)
     context_eval(a_user, tags + '&lt;template&gt;&lt;p:&gt;&lt;%= this %&gt;&lt;/p:&gt;&lt;/template&gt;').should == '&lt;p&gt;Tom&lt;/p&gt;'
   end
 
-  
+
   # --- &lt;set&gt; --- #
-  
+
   it &quot;should provide &lt;set&gt; to create local variables&quot; do
     eval_dryml(&quot;&lt;set x='&amp;1' y='&amp;2'/&gt;&lt;%= x + y %&gt;&quot;).should == '3'
   end
-  
+
   it &quot;should support assignment to dotted names with &lt;set&gt;&quot; do
     eval_dryml(&quot;&lt;set s='&amp;Struct.new(:a).new'/&gt;&lt;set s.a='&amp;10'/&gt;&lt;%= s.a %&gt;&quot;).should == '10'
   end
-  
-  it 'should interpolate #{...} blocks in attributes of any tag' do 
+
+  it 'should interpolate #{...} blocks in attributes of any tag' do
     tag = '&lt;def tag=&quot;t&quot; attrs=&quot;x&quot;&gt;&lt;%= x %&gt;&lt;/def&gt;'
-    
+
     eval_dryml(tag + &quot;&lt;t x='#{1+2}'/&gt;&quot;).should == '3'
     eval_dryml(tag + &quot;&lt;t x='hey #{1+2} ho'/&gt;&quot;).should == 'hey 3 ho'
 
     eval_dryml(tag + &quot;&lt;p class='#{1+2}'/&gt;&quot;).should == &quot;&lt;p class='3'/&gt;&quot;
     eval_dryml(tag + &quot;&lt;p class='hey #{1+2} ho'/&gt;&quot;).should == &quot;&lt;p class='hey 3 ho'/&gt;&quot;
   end
-  
-  
+
+
   # --- &lt;set_scoped&gt; --- #
-  
-  it &quot;should support scoped variables&quot; do 
+
+  it &quot;should support scoped variables&quot; do
     tags =
-      &quot;&lt;def tag='t1'&gt;&lt;set-scoped my-var='ping'&gt;&lt;%= parameters.default %&gt;&lt;/set-scoped&gt;&lt;/def&gt;&quot; + 
+      &quot;&lt;def tag='t1'&gt;&lt;set-scoped my-var='ping'&gt;&lt;%= parameters.default %&gt;&lt;/set-scoped&gt;&lt;/def&gt;&quot; +
       &quot;&lt;def tag='t2'&gt;&lt;set-scoped my-var='pong'&gt;&lt;%= parameters.default %&gt;&lt;/set-scoped&gt;&lt;/def&gt;&quot;
     eval_dryml(tags + &quot;&lt;t1&gt;&lt;%= scope.my_var %&gt;&lt;/t1&gt;&quot;).should == 'ping'
     eval_dryml(tags + &quot;&lt;t1&gt;&lt;t2&gt;&lt;%= scope.my_var %&gt;&lt;/t2&gt; &lt;%= scope.my_var %&gt;&lt;/t1&gt;&quot;).should == 'pong ping'
   end
-  
+
   # --- Taglibs --- #
-  
-  it &quot;should import tags from taglibs with the &lt;include&gt; tag&quot; do 
+
+  it &quot;should import tags from taglibs with the &lt;include&gt; tag&quot; do
     eval_dryml(&quot;&lt;include src='taglibs/simple'/&gt; &lt;foo/&gt;&quot;).should == &quot;I am the foo tag&quot;
   end
-  
-  it &quot;should import tags from taglibs into a namespace with &lt;include as/&gt;&quot; do 
+
+  it &quot;should import tags from taglibs into a namespace with &lt;include as/&gt;&quot; do
     proc { eval_dryml(&quot;&lt;include src='taglibs/simple' as='a'/&gt; &lt;foo/&gt;&quot;) }.should raise_error
     eval_dryml(&quot;&lt;include src='taglibs/simple' as='a'/&gt; &lt;a.foo/&gt;&quot;).should == &quot;I am the foo tag&quot;
   end
-  
-  
+
+
   # --- Control Attributes --- #
-  
-  it &quot;should alow static tags to be conditional with the 'if' attribute&quot; do 
+
+  it &quot;should alow static tags to be conditional with the 'if' attribute&quot; do
     eval_dryml(&quot;&lt;p if='&amp;false'/&gt;&quot;).should == &quot;&quot;
     eval_dryml(&quot;&lt;p if='&amp;true'/&gt;&quot;).should == &quot;&lt;p /&gt;&quot;
 
     eval_dryml(&quot;&lt;p if='&amp;false'&gt;hello&lt;/p&gt;&quot;).should == &quot;&quot;
     eval_dryml(&quot;&lt;p if='&amp;true'&gt;hello&lt;/p&gt;&quot;).should == &quot;&lt;p&gt;hello&lt;/p&gt;&quot;
   end
-  
-  it &quot;should alow static tags to be repeated with the 'repeat' attribute&quot; do 
-    eval_dryml('&lt;img repeat=&quot;&amp;[1,2,3]&quot; src=&quot;#{this}&quot; /&gt;').should == 
+
+  it &quot;should alow static tags to be repeated with the 'repeat' attribute&quot; do
+    eval_dryml('&lt;img repeat=&quot;&amp;[1,2,3]&quot; src=&quot;#{this}&quot; /&gt;').should ==
       '&lt;img src=&quot;1&quot; /&gt;&lt;img src=&quot;2&quot; /&gt;&lt;img src=&quot;3&quot; /&gt;'
-    
+
     # Make sure &lt;%= %&gt; doesn't break
-    eval_dryml('&lt;img repeat=&quot;&amp;[1,2,3]&quot; src=&quot;&lt;%= this %&gt;&quot; /&gt;').should == 
+    eval_dryml('&lt;img repeat=&quot;&amp;[1,2,3]&quot; src=&quot;&lt;%= this %&gt;&quot; /&gt;').should ==
       '&lt;img src=&quot;1&quot; /&gt;&lt;img src=&quot;2&quot; /&gt;&lt;img src=&quot;3&quot; /&gt;'
   end
-  
-  it &quot;should alow defined tags to be repeated with the 'repeat' attribute&quot; do 
+
+  it &quot;should alow defined tags to be repeated with the 'repeat' attribute&quot; do
     eval_dryml('&lt;def tag=&quot;t&quot;&gt;&lt;%= this %&gt;&lt;/def&gt;&lt;t repeat=&quot;&amp;[1,2,3]&quot;/&gt;').should == '123'
   end
 
   it &quot;should allow &lt;else&gt; to be used with the if attribute&quot; do
     eval_dryml(&quot;&lt;p if='&amp;false'/&gt;&lt;%= Hobo::Dryml.last_if %&gt;&quot;).should == &quot;false&quot;
   end
-  
-  
+
+
   # --- Whitespace Suppression --- #
-  
-#  it &quot;should remove allow newlines to be removed by adding a ' -' at the end of a line&quot; do 
+
+#  it &quot;should remove allow newlines to be removed by adding a ' -' at the end of a line&quot; do
 #    src = &lt;&lt;-END
 #&lt;def tag=&quot;t&quot;&gt; -
 #  My Tag -
@@ -633,22 +633,22 @@ describe Template do
 #END
 #    eval_dryml(src).should == &quot;&lt;p&gt;My Tag&lt;/p&gt;&quot;
 #  end
-  
-  
+
+
   # --- Testing for parameters --- #
-  
-  it &quot;should be possible to test for the presence of a parameter with parameters.foo?&quot; do 
+
+  it &quot;should be possible to test for the presence of a parameter with parameters.foo?&quot; do
     tag = &quot;&lt;def tag='t'&gt;&lt;%= parameters.foo? ? 'y' : 'n' %&gt;&lt;/def&gt;&quot;
     eval_dryml(tag + &quot;&lt;t/&gt;&quot;).should == &quot;n&quot;
     eval_dryml(tag + &quot;&lt;t&gt;&lt;foo:/&gt;&lt;/t&gt;&quot;).should == &quot;y&quot;
   end
 
-  
+
   # --- Test Helpers --- #
-  
+
   def prepare_template(src, options)
     options.reverse_merge!(:template_path =&gt; &quot;TEST&quot;)
-    
+
     Hobo::Dryml::Template.clear_build_cache
     @env = Class.new(Hobo::Dryml::TemplateEnvironment)
     template = Template.new(src, @env, options[:template_path])
@@ -656,16 +656,16 @@ describe Template do
     template.instance_variable_set(&quot;@builder&quot;, options[:builder]) if options[:builder]
     template
   end
-  
-  
+
+
   def eval_dryml(src, options={})
     options.reverse_merge!(:locals =&gt; {}, :implicit_imports =&gt; [])
-    
+
     template = prepare_template(src, options)
     template.compile(options[:locals].keys, options[:implicit_imports])
     new_renderer.render_page(options[:context], options[:locals]).strip
   end
-  
+
   def compile_dryml(src, options={})
     template = prepare_template(src, options)
     CompiledDryml.new(template.process_src)
@@ -678,34 +678,34 @@ describe Template do
   def compile_in_template(src)
     builder = mock(&quot;builder&quot;, :null_object =&gt; true)
     def_src = nil
-    builder.should_receive(:add_build_instruction) do |type, args| 
+    builder.should_receive(:add_build_instruction) do |type, args|
       def_src = args[:src]
     end
     compile_dryml(&quot;&lt;def tag='MyTemplate'&gt;#{src}&lt;/def&gt;&quot;, :builder =&gt; builder)
-    
+
     # get rid of first and last scriptlets - they're to do with the method declaration
     def_src.to_s.sub(/^\&lt;\%.*?\%\&gt;/, &quot;&quot;).sub(/&lt;% _erbout; end; end %&gt;&lt;% _register_tag_attrs.*$/, &quot;&quot;)
   end
-  
+
   def compile_def(src)
     builder = mock(&quot;builder&quot;, :null_object =&gt; true)
     def_src = nil
-    builder.should_receive(:add_build_instruction) do |type, args| 
+    builder.should_receive(:add_build_instruction) do |type, args|
       def_src = args[:src]
     end
     compile_dryml(src, :builder =&gt; builder)
-    
+
     def_src.sub(/&lt;% _register_tag_attrs.*/, &quot;&quot;)
   end
-  
+
 end
 
 class CompiledDryml &lt; String
-  
+
   def ==(other)
     self.to_s.gsub(/\s+/, ' ').strip == other.gsub(/\s+/, ' ').strip
   end
-  
+
 end
 
 
@@ -716,23 +716,23 @@ module Spec
       def initialize(expected)
         @expected = expected
       end
-      
+
       def matches?(actual)
         @actual = actual
         expected_dom = HTML::Document.new(@expected).root
         actual_dom = HTML::Document.new(@actual).root
         expected_dom == actual_dom
       end
-      
+
       def failure_message
         &quot;#{@expected}\nexpected to be == (by DOM) to\n#{@actual}&quot;
       end
-      
+
       def description
         &quot;be DOM equal to\n#{@expected}&quot;
       end
     end
-    
+
     def be_dom_equal_to(expected)
       Matchers::BeDomEqualTo.new(expected)
     end</diff>
      <filename>hobo_spec/unit/hobo/dryml/template_spec.rb</filename>
    </modified>
  </modified>
  <removed type="array">
    <removed>
      <filename>hobo/lib/hobo/dryml/tag_extractor.rb</filename>
    </removed>
  </removed>
  <parents type="array">
    <parent>
      <id>db40016dd01ecd7b6254589e15be10b5269d34e4</id>
    </parent>
    <parent>
      <id>0553a982671f81ead5fab9190a211f1afe2cc2a9</id>
    </parent>
  </parents>
  <author>
    <name>Tom Locke</name>
    <email>tom@tomlocke.com</email>
  </author>
  <url>http://github.com/tablatom/hobo/commit/fbad60018d6c91faeb60b682adadf723cc550a58</url>
  <id>fbad60018d6c91faeb60b682adadf723cc550a58</id>
  <committed-date>2008-06-13T11:14:56-07:00</committed-date>
  <authored-date>2008-06-13T11:14:56-07:00</authored-date>
  <message>Merge branch 'drnic'

Fixed conflicts in:

	hobo/lib/hobo/dryml.rb
	hobo/lib/hobo/model_controller.rb</message>
  <tree>76d08f14fc66287afe94711b9d10f4667431e7e2</tree>
  <committer>
    <name>Tom Locke</name>
    <email>tom@tomlocke.com</email>
  </committer>
</commit>
