<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>MIT-LICENSE</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -1,25 +1,45 @@
 = About
 
-Fluently is a JavaScript toolkit for creating &quot;Fluent Interfaces&quot;[http://martinfowler.com/bliki/FluentInterface.html].  With Fluently, you can create an object thus:
+Fluently is a JavaScript toolkit for creating FluentInterfaces[http://martinfowler.com/bliki/FluentInterface.html].
+
+With Fluently, you can do this:
+    var o = Fluently.make(function(define) {
+      define('fn1', function() {console.info('called fn1')});
+      define('fn2', function() {console.info('called fn2')});
+      define('fn3', function() {return 3});
+    });
+to define an object with chained methods, that can be invoked thus:
+  o.fn1().fn2() // calls fn1 and then fn2
+  o.fn2().fn1() // calls fn2 and then fn1
+  o.fn1().fn3() // returns 3 (an explicit 'return' breaks the chain)
+
+You can also define modifiers, and aliases:
     var o = Fluently.make(function(define) {
       define('fn1', function() {console.info('called fn1')});
       define('fn2', function() {console.info('called fn2')});
       define.empty('and');
       define.alias('fn3', 'fn1');
+      define.modifier('not');
     });
-to define an object with chained methods, that can be invoked like this:
-  o.fn1().fn2()
-  o.fn2().fn3()
-  o.fn2().and.fn3()
+  
+  o.fn3(); // same as o.fn1()
+  o.fn1().and.fn2() // same as o.fn1().fn2()
+  o.fn1().and.not.fn2() // options.not is set when fn2 is called
 
-I use it to define the mocks, stubs, and expectations in LzTestKit.
+I use this to define the mocks, stubs, and expectations in LzTestKit[http://osteele.com/sources/openlaszlo/lztestkit].
 
-I've extracted a couple of files, from LzTestKit, into the 'examples'
+I've extracted a couple of files, from LzTestKit, into the examples[http://osteele.com/sources/javascript/fluently/examples/]
 directory.  These don't run on their own, but at least they show the
 code in use.
 
+You can also see a range of examples by viewing the sources to the specs[http://osteele.com/sources/javascript/fluently/specs/].
+
+= Download
+
+Get it here: {download-location}.
+
 = License
 
 Fluently is licensed under the MIT License.
 
-This package includes a distribution of jsspec, which is licensed under the GLPL.
+This package includes a distribution of jsspec, which is licensed under the LGPL.</diff>
      <filename>README</filename>
    </modified>
    <modified>
      <diff>@@ -1,11 +1,10 @@
 require 'rake/packagetask'
-require 'rake/packagetask.rb'
 
 PROJECT_NAME = &quot;fluently&quot;
 RELEASE_VERSION = open('VERSION').read.chomp
 PACKAGE_NAME = &quot;#{PROJECT_NAME}-#{RELEASE_VERSION}.tgz&quot;
 
-IGNORE_FILES = Dir['**/#*#'] + Dir['**/.#*'] + Dir['build/**'] + Dir['working/**'] + %w{build working agenda.txt}
+IGNORE_FILES = Dir['**/#*#'] + Dir['**/.#*'] + Dir['build/**'] + Dir['working/**'] + Dir['pkg/*'] + %w{build working agenda.txt}
 PACKAGE_FILES = Dir['**/*'] - Dir['*.tgz'] - IGNORE_FILES
 
 task :docs =&gt; 'build/index.html'
@@ -17,8 +16,9 @@ end
 
 task :publish =&gt; [:package, :docs] do
   target = &quot;osteele.com:osteele.com/sources/javascript/fluently&quot;
-  sh &quot;rsync README #{PACKAGE_NAME} #{target}&quot;
+  sh &quot;rsync pkg/* #{target}&quot;
   sh &quot;rsync build/index.html #{target}/index.html&quot;
+  sh &quot;rsync -a #{PACKAGE_FILES.join(' ')} #{target}&quot;
 end
 
 task :clean do</diff>
      <filename>Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -1,7 +1,9 @@
 * Next
+- accept multiple modifiers
 - more test cases: modifiers, aliases; look at every code path
 - examples
 
 * API
+- define empty alias with define.alias
 - default modifier table, retrieved via this
 - define a set of objects</diff>
      <filename>agenda.txt</filename>
    </modified>
    <modified>
      <diff>@@ -7,18 +7,19 @@
 &lt;script type=&quot;text/javascript&quot; src=&quot;../jsspec/diff_match_patch.js&quot;&gt;&lt;/script&gt;
 &lt;script type=&quot;text/javascript&quot; src=&quot;../jsspec/JSSpec.js&quot;&gt;&lt;/script&gt;
 &lt;script type=&quot;text/javascript&quot; src=&quot;../fluently.js&quot;&gt;&lt;/script&gt;
-&lt;script type=&quot;text/javascript&quot;&gt;// &lt;![CDATA[
+&lt;script type=&quot;text/javascript&quot;&gt;//&lt;![CDATA[
 describe('Definitions', {
-	'should call the right function': function() {
-		var chain = Fluently.make(function(define) {
+    'should call the right function': function() {
+        var chain = Fluently.make(function(define) {
             define('a', function() {return 1});
             define('b', function() {return 2});
         });
         value_of(chain.a()).should_be(1);
-	},
-	'should chain': function() {
+        value_of(chain.b()).should_be(2);
+    },
+    'should chain': function() {
         var trace;
-		var chain = Fluently.make(function(define) {
+        var chain = Fluently.make(function(define) {
             define('reset', function() {trace = ''});
             define('a', function() {trace += 'a'});
             define('b', function() {trace += 'b'});
@@ -26,9 +27,61 @@ describe('Definitions', {
         });
         value_of(chain.reset().a().trace()).should_be('a');
         value_of(chain.reset().a().b().trace()).should_be('ab');
-	}
+    },
+    'should recognize aliases': function() {
+        var chain = Fluently.make(function(define) {
+            define('a', function() {return 1});
+            define('b', function() {return 2});
+            define.empty('self');
+            define.alias('alias_a', 'a');
+            define.alias('alias_b', 'b');
+        });
+        value_of(chain.self.a()).should_be(1);
+        value_of(chain.alias_a()).should_be(1);
+        value_of(chain.alias_b()).should_be(2);
+        value_of(chain.self.alias_a()).should_be(1);
+    },
+    'should apply modifiers': function() {
+        var trace;
+        var options = {};
+        options.reset = function() {
+            for (var name in options)
+                if (name != 'reset')
+                    delete options[name];
+        }
+        function t(methodName) {
+            var optionNames = [];
+            for (var name in options)
+                name == 'reset' || optionNames.push(name);
+            optionNames.sort();
+            spans = [methodName, '('];
+            for (var ix = 0; ix &lt; optionNames.length; ix++) {
+                var name = optionNames[ix];
+                ix &amp;&amp; spans.push(',');
+                spans.push(name);
+                options[name] == true || spans.push(':', options[name]);
+            }
+            spans.push(')');
+            trace += spans.join('');
+        }
+        var chain = Fluently.make(function(define) {
+            define.modifier.dictionary(options);
+            define.modifier('o1');
+            define.modifier('o2');
+            define('reset', function() {trace = ''; options.reset()});
+            define('a', function() {t('a')});
+            define('b', function() {t('b')});
+            define('trace', function() {return trace});
+        });
+        value_of(chain.reset().a().trace()).should_be('a()');
+        value_of(chain.reset().a().b().trace()).should_be('a()b()');
+        value_of(chain.reset().o1.a().trace()).should_be('a(o1)');
+        value_of(chain.reset().o2.a().trace()).should_be('a(o2)');
+        // pending:
+        // value_of(chain.reset().o1.o2.a().trace()).should_be('a(o1)');
+    }
 })
-// ]]&gt;&lt;/script&gt;
+//]]&gt;&lt;/script&gt;
 &lt;/head&gt;
 &lt;body&gt;&lt;div style=&quot;display:none;&quot;&gt;&lt;p&gt;A&lt;/p&gt;&lt;p&gt;B&lt;/p&gt;&lt;/div&gt;&lt;/body&gt;
-&lt;/html&gt;
\ No newline at end of file
+&lt;/html&gt;</diff>
      <filename>specs/fluently-spec.html</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>c5f36a9563b4b87e1d884b95e51a05d59e250ff6</id>
    </parent>
  </parents>
  <author>
    <name>Oliver Steele</name>
    <email>steele@osteele.com</email>
  </author>
  <url>http://github.com/osteele/fluently/commit/4c66866f89d12abdf743ef24494ac64ca3a69c5e</url>
  <id>4c66866f89d12abdf743ef24494ac64ca3a69c5e</id>
  <committed-date>2008-01-23T14:42:23-08:00</committed-date>
  <authored-date>2008-01-23T14:42:23-08:00</authored-date>
  <message>more specs, docs</message>
  <tree>c33963af8485e4656dcffcd64aea1beac0947472</tree>
  <committer>
    <name>Oliver Steele</name>
    <email>steele@osteele.com</email>
  </committer>
</commit>
