<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
 
	<title>AppDen</title>
	<subtitle>Advanced JavaScript techniques, tips on avoiding those nasty CSS bugs, and musings on technological progress.</subtitle>
	
	<link href="http://appden.com" rel="alternate" type="text/html" />
	<id>http://appden.com</id>
	<updated>2010-03-17T23:58:11-07:00</updated>
	<author>
		<name>Scott Kyle</name>
	</author>

	
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/appden" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="appden" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
			<title>Puncture Closures to Create Wormholes</title>
			<link href="http://appden.com/javascript/puncture-closures/" rel="alternate" type="text/html" />
			<updated>2009-12-09T00:00:00-08:00</updated>
			<id>http://appden.com/javascript/puncture-closures</id>
			<content type="html">&lt;p&gt;Have you ever wanted access to a closure&amp;#8217;s precious private variables?  Has static scoping got you down?  Well put your mind at ease, and worry no longer!&lt;sup class="footnote"&gt;&lt;a href="#fn1"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nb"&gt;Function&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;puncture&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;wormhole&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__cmd__&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;eval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__cmd__&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;source&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/function.+?\{([\s\S]*)\}/&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;fn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;this.wormhole=&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;wormhole&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;\n&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;prop&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hasOwnProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prop&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;prop&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;prop&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;Now I know you&amp;#8217;re excited, and probably asking yourself how you can start puncturing closures today.  Well here&amp;#8217;s an example of how it works!&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;WellDesignedClass&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;secret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Nobody can access this variable, muahahaha&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;PuncturedClass&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;WellDesignedClass&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;puncture&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;useless&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;PuncturedClass&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;secret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useless&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;wormhole&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;secret&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c"&gt;// not so secret anymore!&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;You can watch &lt;a href="http://gist.github.com/248013"&gt;this gist&lt;/a&gt; for improvements on this must-have plugin!&lt;/p&gt;
&lt;p class="footnote" id="fn1"&gt;&lt;sup&gt;1&lt;/sup&gt; This code merely proves a concept. It could be fleshed out to actually accomplish things, but that would be insane.&lt;/p&gt;</content>
		</entry>
	
		<entry>
			<title>Get Tweets with MooTools</title>
			<link href="http://appden.com/javascript/get-tweets-with-mootools/" rel="alternate" type="text/html" />
			<updated>2009-09-19T00:00:00-07:00</updated>
			<id>http://appden.com/javascript/get-tweets-with-mootools</id>
			<content type="html">&lt;p&gt;To give this site a little &lt;em&gt;dynamism&lt;/em&gt;, I decided (as many others have) to pull my latest tweets into the rather barren sidebar.  David Walsh&amp;#8217;s &lt;a href="http://davidwalsh.name/mootools-twitter-plugin"&gt;TwitterGitter&lt;/a&gt; was a good start, but I saw some room for improvement by subclassing &lt;code&gt;Request.JSONP&lt;/code&gt;.  The result is a great example of how &lt;a href="http://mootools.net"&gt;MooTools&lt;/a&gt; grants you a great deal of object oriented power. I kept David&amp;#8217;s &lt;code&gt;linkify&lt;/code&gt; method (with some regex tweaks) because it is awesome.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nx"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Twitter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Class&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;

  &lt;span class="nx"&gt;Extends&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;JSONP&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;

  &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;linkify&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;http://twitter.com/statuses/user_timeline/{term}.json&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
  
  &lt;span class="nx"&gt;initialize&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;term&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;substitute&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="nx"&gt;term&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;term&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
  
  &lt;span class="nx"&gt;success&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;linkify&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;each&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tweet&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
      &lt;span class="nx"&gt;tweet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;linkify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tweet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    
    &lt;span class="c"&gt;// keep subsequent calls newer&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;since_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
  
  &lt;span class="nx"&gt;linkify&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="c"&gt;// modified from TwitterGitter by David Walsh (davidwalsh.name)&lt;/span&gt;
    &lt;span class="c"&gt;// courtesy of Jeremy Parrish (rrish.org)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/(https?:\/\/[\w\-:;?&amp;amp;=+.%#\/]+)/gi&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;lt;a href=&amp;quot;$1&amp;quot;&amp;gt;$1&amp;lt;/a&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
               &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/(^|\W)@(\w+)/g&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;$1&amp;lt;a href=&amp;quot;http://twitter.com/$2&amp;quot;&amp;gt;@$2&amp;lt;/a&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
               &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/(^|\W)#(\w+)/g&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;$1#&amp;lt;a href=&amp;quot;http://search.twitter.com/search?q=%23$2&amp;quot;&amp;gt;$2&amp;lt;/a&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;Hopefully the code speaks for itself. I&amp;#8217;ll keep &lt;a href="http://gist.github.com/189534"&gt;this Gist&lt;/a&gt; updated with any bugfixes.&lt;/p&gt;


</content>
		</entry>
	
		<entry>
			<title>Journey to Jekyll</title>
			<link href="http://appden.com/personal/journey-to-jekyll/" rel="alternate" type="text/html" />
			<updated>2009-09-06T00:00:00-07:00</updated>
			<id>http://appden.com/personal/journey-to-jekyll</id>
			<content type="html">&lt;p&gt;I did it.  I&amp;#8217;ve freed myself from the shackles of a database, excessively complex blogging software, and many wasted computing cycles.  I&amp;#8217;ve escaped to the greener pastures of text and git with &lt;a href="http://jekyllrb.com/"&gt;Jekyll&lt;/a&gt;, the same engine that powers &lt;a href="http://pages.github.com/"&gt;GitHub Pages&lt;/a&gt;.  You can too!&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s very simple, check out this site&amp;#8217;s &lt;a href="http://github.com/appden/appden.github.com/tree"&gt;source&lt;/a&gt; to see what I mean.  Feel free to &amp;#8220;steal&amp;#8221; my code.  I kept it general enough where changing the &lt;span class="caps"&gt;YAML&lt;/span&gt; and &lt;span class="caps"&gt;CSS&lt;/span&gt; will give you a brand new working blog.  It&amp;#8217;s hard to even describe how easy it will be to manage this site thanks to Jekyll.  It&amp;#8217;s so simple and powerful, yet young and full of potential.&lt;/p&gt;
&lt;h3&gt;Deploys&lt;/h3&gt;
&lt;p&gt;Tate Johnson has an &lt;a href="http://tatey.com/2009/04/29/jekyll-meets-dreamhost-automated-deployment-for-jekyll-with-git.html"&gt;excellent post&lt;/a&gt; on setting up deploys to DreamHost using &lt;code&gt;git push&lt;/code&gt;, but I wanted my setup to be even simpler so I opted for rsync controlled by Rake.  This translates into needing &lt;strong&gt;zero&lt;/strong&gt; setup on the server, just &lt;code&gt;sudo gem install jekyll&lt;/code&gt; on your machine to develop locally.  See my Rakefile if you&amp;#8217;re curious, it&amp;#8217;s very easy to understand once you see it.&lt;/p&gt;
&lt;h3&gt;Comments&lt;/h3&gt;
&lt;p&gt;Easy. &lt;a href="http://disqus.com"&gt;&lt;span class="caps"&gt;DISQUS&lt;/span&gt;&lt;/a&gt;. Done. Next question.&lt;/p&gt;
&lt;h3&gt;Movable Type&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://www.movabletype.org/"&gt;Movable Type&lt;/a&gt; provides hideous default templates and a very programmer-&lt;strong&gt;un&lt;/strong&gt;friendly template language.  While I believe it&amp;#8217;s cleaner than &lt;a href="http://wordpress.org/"&gt;Wordpress&lt;/a&gt;, it still suffers from having being too complicated for the average blogger.   The experience of editing templates is dreadful, unless you have manually &amp;#8220;linked&amp;#8221; each individual template to a file then setup &lt;span class="caps"&gt;SVN&lt;/span&gt; hooks to update those files and trigger a full rebuild of your site.  Even after all that, it&amp;#8217;s still awful, and don&amp;#8217;t get me started on maintaining a separate development version of your blog.&lt;/p&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;This site is now completely naked, the source exposed for all the world to gawk at on GitHib, so &lt;a href="http://github.com/appden/appden.github.com/tree"&gt;check it out&lt;/a&gt;.  I&amp;#8217;m loving the feeling of complete transparency, it forces me to write better quality, more generic code.  Thanks to Jekyll, I&amp;#8217;ll be able to happily further develop my site, rather than dread touching it.&lt;/p&gt;






</content>
		</entry>
	
		<entry>
			<title>Predictions for the Next iPhone</title>
			<link href="http://appden.com/tech/iphone-predictions/" rel="alternate" type="text/html" />
			<updated>2009-06-21T00:00:00-07:00</updated>
			<id>http://appden.com/tech/iphone-predictions</id>
			<content type="html">&lt;p&gt;The iPhone 3GS has been all the rage, and admittedly I&amp;#8217;m still pondering the upgrade from my 3G.  Sure, I can nab it for $200 from AT&amp;amp;T and sell my current one to cover the costs, but what about next year?  Will AT&amp;amp;T allow full subsidized price again to those who already took advantage of it twice within two years?  I&amp;#8217;m not so sure.&lt;/p&gt;
&lt;p&gt;So I think I&amp;#8217;ll wait for the next iPhone, and in the interest of saying &amp;#8220;I told you so,&amp;#8221; I am making the following predictions for it and the 4.0 OS.&lt;/p&gt;
&lt;h4&gt;iPhone 4th Generation (though probably not 4G)&lt;/h4&gt;
&lt;ul class="double-space"&gt;
	&lt;li&gt;&lt;strong&gt;&lt;span class="caps"&gt;OLED&lt;/span&gt; Display&lt;/strong&gt; &amp;#8212; That&amp;#8217;s right.  I see this being its biggest differentiator.  It&amp;#8217;ll be bright, vivid, energy efficient, and sexy as hell.  When seen next to an older model, there&amp;#8217;ll be absolutely no comparison, and again Apple will have raised the bar for all other mobile devices that follow.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Multi-core&lt;/strong&gt; &amp;#8212; This has already been speculated on &lt;a href="http://www.appleinsider.com/articles/09/06/16/multi_core_arm_chips_bound_for_apples_next_gen_iphones.html"&gt;AppleInsider&lt;/a&gt;, and I suggest you read more about it there if you haven&amp;#8217;t already.  See below for my prediction on backgrounding support for third party apps.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Faster Networking&lt;/strong&gt; &amp;#8212; I see this coming in the form of 802.11n support, which will work really nicely with WiFi Syncing (see below).  They just introduced &lt;span class="caps"&gt;HSDPA&lt;/span&gt; 7.2 Mbps support in the 3GS and AT&amp;amp;T still has to play catch-up, so I don&amp;#8217;t think the 4th-gen will really be 4G, as in WiMax or something similar.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Minor Cosmetic Update&lt;/strong&gt; &amp;#8212; Time to thin it out a bit and visually differentiate it from the 3G and 3GS.  I have a hunch that they may offer a wider range of color options, as the iPods do.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Better Battery Life&lt;/strong&gt; &amp;#8212; Time to steal some tech from the MacBook division to keep 3G network users happy.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Same camera&lt;/strong&gt; &amp;#8212; I see another camera update coming in the following model, not this one.  Also, I really don&amp;#8217;t expect a front camera for video chatting.  It just wouldn&amp;#8217;t get used by the vast majority of users.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;iPhone 4.0 Operating System&lt;/h4&gt;
&lt;ul class="double-space"&gt;
	&lt;li&gt;&lt;strong&gt;WiFi Sync&lt;/strong&gt; &amp;#8212; It&amp;#8217;s something I&amp;#8217;ve always wished for more than copy &amp;amp; paste and I believe 4.0 will make it a reality.  The programming is mostly there with the Apple TV and MobileMe, and with &lt;span class="caps"&gt;MMS&lt;/span&gt; and copy &amp;amp; paste out of the way, I think we&amp;#8217;ll start to see this more on iPhone wish lists.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Reimagined Home Screen&lt;/strong&gt; &amp;#8212; The current home screen design is already buckling under the weight of the more and more apps that people are loading onto their phones.  The new design will still be very &amp;#8220;iPhone-esque,&amp;#8221; but will make launching and organizing large numbers of apps much easier for the user.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Limited Multi-tasking Support&lt;/strong&gt; &amp;#8212; We have push now, but the Pre has a nice card-centric UI for running multiple apps at once.  I see Apple allowing something similar, but with reasonable limitations, in 4.0 for both the 3GS and the 4th-gen model.  The 3GS has the horsepower but may need more limitations, while with two cores, the 4th-gen will practically be made for this sort of thing. I can see them adding a certification process for apps that want to be able to run in the background.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Also, I predict that Google will soon beef up their iPhone app offerings with GMail and maybe Docs.  At the same time, they&amp;#8217;ll expand push support to the iPhone.  There&amp;#8217;s already offline support, but you still have to use it in Safari, which definitely is a limitation.&lt;/p&gt;
&lt;p&gt;There you have it, all my iPhone related predictions.  I&amp;#8217;ll give myself a report card after the next &lt;span class="caps"&gt;WWDC&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve neglected this infant blog for too long.  I apologize if you feel like it&amp;#8217;s been wasting precious space in your feed reader.  My attention has been all over, and sometimes I second guess posting about a topic becuase I feel it&amp;#8217;s been covered well enough elsewhere.  I&amp;#8217;m about to embark on my month-long vacation kayaking in Oregon and backpacking through Europe, but I have many blog post ideas for when I return.&lt;/p&gt;</content>
		</entry>
	
		<entry>
			<title>Protect Your Class Methods from Evildoers</title>
			<link href="http://appden.com/javascript/protect-your-class-methods-from-evildoers/" rel="alternate" type="text/html" />
			<updated>2009-05-04T00:00:00-07:00</updated>
			<id>http://appden.com/javascript/protect-your-class-methods-from-evildoers</id>
			<content type="html">&lt;p&gt;With the advent of MooTools 1.2.2 comes the ability to mark Class methods as &lt;del&gt;private&lt;/del&gt; &lt;ins&gt;protected&lt;/ins&gt;.  Let&amp;#8217;s take a look at some code.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;Person&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Class&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;

  &lt;span class="nx"&gt;initialize&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;

  &lt;span class="nx"&gt;secret&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;I sometimes like girly drinks&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}.&lt;/span&gt;&lt;span class="nx"&gt;protect&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;  &lt;span class="c"&gt;// &amp;lt;== MAGIC SAUCE&lt;/span&gt;

  &lt;span class="nx"&gt;describe&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Hi, I&amp;#39;m {name}. {secret}. I kid, I kid.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;substitute&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;secret&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;scott&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Scott&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;Notice the &lt;code&gt;protect&lt;/code&gt; call on the &lt;code&gt;secret&lt;/code&gt; method.  It prevents outsiders from calling that method and believing false facts about that person.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;scott.secret();&lt;/code&gt;&lt;br /&gt;
&lt;span style="color:#f00;"&gt;&lt;em&gt;The method &amp;#8220;secret&amp;#8221; cannot be called.&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;It can, however, be called from within an another method.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;scott.describe();&lt;/code&gt;&lt;br /&gt;
&lt;em&gt;Hi, I&amp;#8217;m Scott. I sometimes like girly drinks. I kid, I kid.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;There you have it &amp;#8212; a cool, new, undocumented feature available now in MooTools 1.2.2!&lt;/p&gt;
&lt;p&gt;As I mentioned in my previous article, I have a working implementation of a Privates mutator (to privatize variables) for the latest version of MooTools, but I am waiting to see how post-initialization mutators will look in More.  It&amp;#8217;s something I&amp;#8217;ve discussed at length with &lt;a href="http://clientcide.com"&gt;Aaron Newton&lt;/a&gt;, and hopefully will be available soon.&lt;/p&gt;</content>
		</entry>
	
		<entry>
			<title>BindAll Class Mutator for Saving Your Sanity</title>
			<link href="http://appden.com/javascript/bindall-class-mutator-for-saving-your-sanity/" rel="alternate" type="text/html" />
			<updated>2009-04-14T00:00:00-07:00</updated>
			<id>http://appden.com/javascript/bindall-class-mutator-for-saving-your-sanity</id>
			<content type="html">&lt;p&gt;MooTools is just the best JavaScript thing ever.  And I say that totally subjectively because I honestly don&amp;#8217;t have much experience with anything else other than jQuery.  Some of the design decisions are nothing short of genius &amp;#8212; custom events, element properties, and class mutators &amp;#8212; to name a few.&lt;/p&gt;
&lt;p&gt;The &lt;a href="http://www.clientcide.com/code-releases/classbinds-for-mootols-is-back/"&gt;Binds mutator&lt;/a&gt; is particularly headache relieving.  My only issue with it is that you need to list out all the methods you want bound, which somehow, I am very prone to jacking up due to forgetfulness or quick refactoring.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nx"&gt;Binds&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;update&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;include&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...]&lt;/span&gt;  &lt;span class="c"&gt;// yadi yada&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;So since I have nothing better to do in the airport than watch a depressing &lt;a href="http://www.fox.com/house/recaps/s5_e20.htm"&gt;House episode&lt;/a&gt;, I figured I&amp;#8217;d write my own BindAll mutator to save myself from my own misery (and maybe save you from yours).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nx"&gt;Class&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Mutators&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;BindAll&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;self&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;self&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;      &lt;span class="c"&gt;// mutate or get out&lt;/span&gt;
	
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;init&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;initialize&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;  &lt;span class="c"&gt;// save original, if there is one&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;exclude&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;callee&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exclude&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;initialize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;method&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;method&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;function&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;exclude&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;method&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
			
      &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;unbound&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;method&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;method&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;unbound&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;method&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;__parent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;unbound&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;__parent&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="c"&gt;// if there was an original initialize, run it&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;init&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;init&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
	
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;self&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;Class&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Mutators&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;BindAll&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exclude&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;constructor&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;initialize&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;parent&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;With this, all methods get bound, and it&amp;#8217;s this simple:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nx"&gt;BindAll&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;  &lt;span class="c"&gt;// or anything else truthy&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;So now, class methods can be passed around without fear of them forgetting who &lt;code&gt;this&lt;/code&gt; is:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;flashing_red&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;addEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;click&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;destruct&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;This might not be for everyone, but for me, I can&amp;#8217;t see why I wouldn&amp;#8217;t want all my methods to be bound properly, and if I do run into that scenario, then I&amp;#8217;d fall back to the regular Binds mutator.  I also made the function name exclude list accessible to the programmer to add more if needed.  Bugfixes will be made on the &lt;a href="http://gist.github.com/95379"&gt;GitHub Gist&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Another class mutator that has gotten a fair bit of my attention is Privates, which has had many implementations, including &lt;a href="http://www.nwhite.net/2008/10/10/private-methods-with-mootools-update2/"&gt;Nathan White&amp;#8217;s&lt;/a&gt; (deeply flawed), &lt;a href="http://thomasdullnig.blogspot.com/2009/01/private-members-in-mootools-i-do-it-my.html"&gt;Thomas Dullnig&amp;#8217;s&lt;/a&gt; (flawed), and &lt;a href="http://mcarthurgfx.com/blog/article/getting-private-variables-in-a-mootools-class"&gt;Sean McCarthur&amp;#8217;s&lt;/a&gt; (not flawed, but not pretty either).  I&amp;#8217;ve totally embarrassed myself in an email to &lt;a href="http://www.clientcide.com/"&gt;Aaron Newton&lt;/a&gt; over the matter, essentially arguing the inclusion of Nathan White&amp;#8217;s implementation into More before realizing that it was creating a bunch of global variables.  Soon, I&amp;#8217;ll write about my own implementation that I just made, as soon as I quadruple check that it isn&amp;#8217;t flawed as well. That one will need specs!&lt;/p&gt;





</content>
		</entry>
	
		<entry>
			<title>Safari 4 Beta Breaks <code>Class.implement()</code></title>
			<link href="http://appden.com/javascript/safari-04-beta-breaks-classimplement/" rel="alternate" type="text/html" />
			<updated>2009-04-08T00:00:00-07:00</updated>
			<id>http://appden.com/javascript/safari-04-beta-breaks-classimplement</id>
			<content type="html">&lt;p&gt;I just spent a few hours tracking down this lovely bug that broke my &lt;a href="http://appden.com/portfolio/"&gt;portfolio page&lt;/a&gt; in Safari 4 Beta (build 5528.16).  If you add a property to a constructor&amp;#8217;s prototype after initializing an object from that constructor, then that new property will not be enumerable in a for-in loop (presumably it&amp;#8217;s been mistakenly marked &lt;a href="https://developer.mozilla.org/en/ECMAScript_DontEnum_attribute"&gt;DontEnum&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;ins&gt;(&lt;strong&gt;update:&lt;/strong&gt; The May 12th update to Safari 4 &amp;#8211; build 5528.17 &amp;#8211; fixes this issue, woohoo)&lt;/ins&gt;&lt;/p&gt;
&lt;p&gt;I first discovered this when the &lt;a href="http://appden.com/javascript/fun-with-custom-events-on-elements-in-mootools/"&gt;&lt;code&gt;oneEvent&lt;/code&gt;&lt;/a&gt; method that I added to the Events Class was not getting implemented into my other Classes.  The JS.Class blog &lt;a href="http://blog.jcoglan.com/2009/03/04/urgent-bug-fix-release-for-jsclass-16/"&gt;mentioned&lt;/a&gt; a &lt;code&gt;Function.prototype&lt;/code&gt; enumeration bug that may be related, but other than that I couldn&amp;#8217;t find any mention of this problem on Google.&lt;/p&gt;
&lt;p&gt;Here is the reduction that I submitted to Apple:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c"&gt;// constructor&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;House&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
&lt;span class="nx"&gt;House&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;garage&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;yard&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c"&gt;// this works&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;house&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;House&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;prop&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;house&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;house has a &amp;#39;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;prop&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c"&gt;// add a new property after using constructor&lt;/span&gt;
&lt;span class="nx"&gt;House&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="c"&gt;// we can see the pool in the prototype&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;prop&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;House&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;blueprint contains &amp;#39;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;prop&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c"&gt;// enumeration won&amp;#39;t find the pool&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;mansion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;House&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;prop&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;mansion&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;mansion has a &amp;#39;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;prop&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c"&gt;// but the pool is there&lt;/span&gt;
&lt;span class="nx"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;check for pool in house...&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="o"&gt;!!&lt;/span&gt;&lt;span class="nx"&gt;house&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pool&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;check for pool in mansion...&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="o"&gt;!!&lt;/span&gt;&lt;span class="nx"&gt;mansion&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pool&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;line&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;line&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;lt;br/&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;Which in Safari 4 Beta, yields&amp;#8230;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;house has a garage
house has a yard
pool now added to blueprint
blueprint contains garage
blueprint contains yard
blueprint contains pool
mansion has a garage
mansion has a yard
check for pool in house...true
check for pool in mansion...true&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The line, &lt;strong&gt;mansion has a pool&lt;/strong&gt;, is never printed in Safari 4 Beta!  It does, however, get printed in the latest Webkit Nightly, but I&amp;#8217;m not sure when this bug was fixed and if Apple has merged that fix into their Safari 4 branch.  I hope they have already, and if not, that they do so when they read my bug report.&lt;/p&gt;
&lt;p&gt;I hope this helped put somebody&amp;#8217;s mind at ease.&lt;/p&gt;


</content>
		</entry>
	
		<entry>
			<title>Element Creation Shortcut in MooTools</title>
			<link href="http://appden.com/javascript/element-creation-shortcut-in-mootools/" rel="alternate" type="text/html" />
			<updated>2009-04-01T00:00:00-07:00</updated>
			<id>http://appden.com/javascript/element-creation-shortcut-in-mootools</id>
			<content type="html">&lt;p&gt;Lately, I&amp;#8217;ve been bothered about the amount of typing and lines required to create a simple element in MooTools.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;curly&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Element&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;div&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;curly&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
  &lt;span class="s1"&gt;&amp;#39;class&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;stooge&amp;#39;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;In jQuery, you&amp;#8217;re given the convenience of writing &lt;span class="caps"&gt;HTML&lt;/span&gt; into the jQuery function &amp;#8212;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;$curly&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;lt;div id=&amp;quot;curly&amp;quot; class=&amp;quot;stooge&amp;quot; /&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;To me, this is quick and easy, but it&amp;#8217;s very unnatural typing &lt;span class="caps"&gt;HTML&lt;/span&gt; into JavaScript and I&amp;#8217;ve seen this convenience become quickly (and horrifyingly) abused.&lt;sup class="footnote"&gt;&lt;a href="#fn1"&gt;1&lt;/a&gt;&lt;/sup&gt;  MooTools deserves something cleaner and cooler, so today I realized I could use a limited selector to create an element.  I liked that idea very much.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;curly&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;$E&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;div#curly.stooge&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;&lt;ins&gt;(&lt;strong&gt;update:&lt;/strong&gt; Apparently I&amp;#8217;m not the first to think of this.  A couple weeks before I wrote this post, &lt;a href="http://github.com/kamicane/mootools-core/commit/c157e231c36d9935053b26dedd08eeb50560f82f"&gt;this commit&lt;/a&gt; was made to MooTools 2.0 adding this capability to &lt;code&gt;new Element&lt;/code&gt;. The idea came from &lt;a href="http://subtlegradient.com/"&gt;Thomas Aylott&lt;/a&gt;.  I am so happy to see this become a part of the next version of MooTools!)&lt;/ins&gt;&lt;/p&gt;
&lt;p&gt;I know, &lt;code&gt;$E&lt;/code&gt; was used in MooTools 1.1 for finding an element by a selector with an optional filter, but that is longer the case in MooTools 1.2.  Besides, &lt;code&gt;$A&lt;/code&gt; and &lt;code&gt;$H&lt;/code&gt; are used for to &lt;em&gt;create&lt;/em&gt; a new array or hash, respectively, so it seems only natural to me to use &lt;code&gt;$E&lt;/code&gt; for creating an element.  If you don&amp;#8217;t like my reasoning, then you can change the name and I promise I won&amp;#8217;t hunt you down.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;$E&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tag&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;string&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nx"&gt;props&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;style&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;tag&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;string&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/#([\w-]+)/&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;classes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/(?:\.[\w-]+)+/&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;tag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/[#.].*/&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;props&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;classes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;class&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;classes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/\./g&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Element&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tag&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;div&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;&lt;ins&gt;(&lt;strong&gt;edit:&lt;/strong&gt; a style string can now optionally be passed into props, further updates will be on GitHub &lt;a href="http://gist.github.com/91433"&gt;here&lt;/a&gt;)&lt;/ins&gt;&lt;/p&gt;
&lt;p&gt;With this new magical utility function, you can quickly and easily create elements with an optional id and any number of classes, along with additional properties passed into the optional second argument.  In fact, you can omit a tag and it&amp;#8217;ll default to a &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;moe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;$E&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;#moe.stooge.leader&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{...});&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;I&amp;#8217;m pretty excited about using this new shortcut, and I hope you are too.  Please shout out in the comments if you find it useful or have any tweaks.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note to plugin developers:&lt;/strong&gt; If you decide to use this, please place it inside of a closure so it doesn&amp;#8217;t override someone else&amp;#8217;s &lt;code&gt;$E&lt;/code&gt; function.  I saw this suggestion on the &lt;a href="twitter"&gt;MooTools Twitter&lt;/a&gt;&lt;sup class="footnote"&gt;&lt;a href="#fn2"&gt;2&lt;/a&gt;&lt;/sup&gt; so I can imagine this becoming a problem &amp;#8212;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nx"&gt;$E&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;&lt;p class="footnote" id="fn1"&gt;&lt;sup&gt;1&lt;/sup&gt; Some even prefer to use double quotes and then escape all the attribute quotes.  Ughh!&lt;/p&gt;
&lt;p class="footnote" id="fn2"&gt;&lt;sup&gt;2&lt;/sup&gt; My &lt;a href="http://appden.com/javascript/fun-with-custom-events-on-elements-in-mootools"&gt;last post&lt;/a&gt; on custom events was linked there!&lt;/p&gt;



</content>
		</entry>
	
		<entry>
			<title>Fun with Custom Events on Elements in MooTools</title>
			<link href="http://appden.com/javascript/fun-with-custom-events-on-elements-in-mootools/" rel="alternate" type="text/html" />
			<updated>2009-03-29T00:00:00-07:00</updated>
			<id>http://appden.com/javascript/fun-with-custom-events-on-elements-in-mootools</id>
			<content type="html">&lt;p&gt;Tonight, I&amp;#8217;ve been playing with the fantastic MooTools plugin, &lt;a href="http://digitarald.de/project/remooz"&gt;ReMooz&lt;/a&gt; by &lt;a href="http://digitarald.de"&gt;Harald Kirschner&lt;/a&gt;, with the hope of adapting it for my upcoming web portfolio.  One of the pieces of functionality I was looking for was to close the zoom box when the user clicks outside of it.  The solution I thought had the most Moo was to create a custom event&lt;sup class="footnote"&gt;&lt;a href="#fn1"&gt;1&lt;/a&gt;&lt;/sup&gt;, &lt;em&gt;clickout&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;ins&gt;(&lt;strong&gt;update:&lt;/strong&gt; I just discovered &lt;a href="http://blog.kassens.net/outerclick-event"&gt;Jan Kassens&lt;/a&gt; blogged a similar custom event, &lt;em&gt;outerClick&lt;/em&gt;.  We took very different approaches, but I thought I&amp;#8217;d give proper credit)&lt;/ins&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nx"&gt;Element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Events&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;clickout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;base&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;click&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;  &lt;span class="c"&gt;// attach click event to element&lt;/span&gt;
  &lt;span class="nx"&gt;condition&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stopPropagation&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  &lt;span class="c"&gt;// stop event from bubbling up&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;  &lt;span class="c"&gt;// never run handler when clicking on element&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;onAdd&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getDocument&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;addEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;click&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;onRemove&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getDocument&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;removeEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;click&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;&lt;ins&gt;(&lt;strong&gt;edit:&lt;/strong&gt; fixed bug that prevented links from working inside the element, further updates will be made on GitHub &lt;a href="http://gist.github.com/91436"&gt;here&lt;/a&gt;)&lt;/ins&gt;&lt;/p&gt;
&lt;p&gt;The condition of the custom event is executed each time the base event is fired to with a return value that determines if the handler should be run.  The condition above prevents the click event from bubbling&lt;sup class="footnote"&gt;&lt;a href="#fn2"&gt;2&lt;/a&gt;&lt;/sup&gt; up to the body, where the handler will actually be attached in the &lt;em&gt;onAdd&lt;/em&gt; callback.  This effectively runs the handler passed into the &lt;em&gt;clickout&lt;/em&gt; event when anywhere on the page is clicked &lt;strong&gt;except&lt;/strong&gt; inside the element where the event was attached.  For example, in ReMooz I wanted to add this event to the zoom box when it is opened.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nx"&gt;ReMooz&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;assign&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;.thumb&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;
  &lt;span class="nx"&gt;onOpen&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;box&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;clickout&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;close&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;onClose&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;box&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;removeEvents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;clickout&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;The event must be removed when the zoom box is closed so the click event attached to be body is also removed.  If the zoom box didn&amp;#8217;t have a close button in it, then I could have applied a &lt;em&gt;singular event&lt;/em&gt;&lt;sup class="footnote"&gt;&lt;a href="#fn3"&gt;3&lt;/a&gt;&lt;/sup&gt; pattern like the &lt;a href="http://docs.jquery.com/Events/one"&gt;&lt;code&gt;jQuery.one()&lt;/code&gt;&lt;/a&gt; method, recreated in MooTools below:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nx"&gt;Native&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;implement&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nx"&gt;Element&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Window&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Document&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Events&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;oneEvent&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;removeEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;callee&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;&lt;ins&gt;(&lt;strong&gt;edit:&lt;/strong&gt; thanks to gonchuki for the idea of using &lt;code&gt;arguments.callee&lt;/code&gt;, further updates will be made on GitHub &lt;a href="http://gist.github.com/91434"&gt;here&lt;/a&gt;)&lt;/ins&gt;&lt;/p&gt;
&lt;p&gt;This allows you to attach an event that only will be run once and then automatically detached.  The only problem with &lt;del&gt;this method&lt;/del&gt; &lt;ins&gt;&lt;code&gt;oneEvent()&lt;/code&gt;&lt;/ins&gt; is that its implementation doesn&amp;#8217;t allow you to remove a specific handler with the &lt;code&gt;removeEvent()&lt;/code&gt; method; you must use &lt;code&gt;removeEvents()&lt;/code&gt; instead to remove all events of &lt;del&gt;a certain type&lt;/del&gt; &lt;ins&gt;the type you added with this method&lt;/ins&gt;.  jQuery doesn&amp;#8217;t have this problem because it uses an &lt;em&gt;event proxy&lt;/em&gt;, so you can still unbind a specific handler.  With a little refactoring, MooTools could allow the same kind of functionality, though the real-world usage of this pattern is admittedly rare.&lt;/p&gt;
&lt;p&gt;I deeply apologize for becoming so serious in this post, I&amp;#8217;ll try to be funnier next time!&lt;/p&gt;
&lt;p class="footnote" id="fn1"&gt;&lt;sup&gt;1&lt;/sup&gt; Check out the &lt;a href="http://demos.mootools.net/CustomEvents"&gt;super cool demo and sample code&lt;/a&gt; for more info on custom events.&lt;/p&gt;
&lt;p class="footnote" id="fn2"&gt;&lt;sup&gt;2&lt;/sup&gt; A quick &lt;a href="http://www.quirksmode.org/js/events_order.html"&gt;refresher course&lt;/a&gt; on event bubbling, if desired.&lt;/p&gt;
&lt;p class="footnote" id="fn3"&gt;&lt;sup&gt;3&lt;/sup&gt; I just made that term up.  I hope it sticks.&lt;/p&gt;






</content>
		</entry>
	
		<entry>
			<title>Lazy List Comprehensions in JavaScript, a Lazy Evaluation</title>
			<link href="http://appden.com/javascript/lazy-list-comprehensions-in-javascript-a-lazy-evalution/" rel="alternate" type="text/html" />
			<updated>2009-03-25T00:00:00-07:00</updated>
			<id>http://appden.com/javascript/lazy-list-comprehensions-in-javascript-a-lazy-evalution</id>
			<content type="html">&lt;p&gt;A while back I made &lt;a href="http://www.reddit.com/r/programming"&gt;Proggit&lt;/a&gt; a regular stop on my daily Internet stroll.  I was struck by the readers&amp;#8217; apparent bias toward Haskell and thought, &lt;em&gt;What the Hell, I should at least attempt to learn something new today&lt;/em&gt;.  It was &lt;a href="http://www.haskell.org/~pairwise/intro/section1.html#part5"&gt;here&lt;/a&gt; that I had that lazy evaluation Eureka moment.  So of course, I then thought to myself, &lt;em&gt;How can I get a piece of that sweet functional programming action in JavaScript?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;For the uninitiated, lazy evaluation is, in a nutshell, the concept of a program not computing the value of something until absolutely needed.  This is especially useful for long (perhaps even infinite) lists that would cause severe nausea or swelling to compute ahead of time.  The example I read about used the &lt;a href="http://en.wikipedia.org/wiki/Fibonacci_number"&gt;Fibonacci sequence&lt;/a&gt; to butter up my brain, so that is what I will use here to electrify yours.&lt;/p&gt;
&lt;p&gt;Quite simply, I wanted the constructor of my &lt;em&gt;Lazy List&lt;/em&gt; to take a definition function, such as the following for the Fibonacci sequence:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;fibs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;fibs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;fibs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;But why would anyone need anything beyond the &lt;code&gt;fibs&lt;/code&gt; function written above? If the unlikely programmer who needs the tenth member of the Fib sequence, just ran &lt;code&gt;fibs(10)&lt;/code&gt;, she would happily get 55 as the answer.  Ahh, but she may want the eleventh member shortly thereafter&amp;#8230;&lt;/p&gt;
&lt;p&gt;Yes, indeed, she needs a simple caching mechanism.  This is a recursive definition we&amp;#8217;re talking about here, not exactly cheap labor.  So here is my first attempt at giving that poor unlikely programmer just what she needs:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c"&gt;// my lazy constructor&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;Lazy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;def&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;cache&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt;
      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;def&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;callee&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// a more awesome Fibonacci sequence&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;fibs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Lazy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;There, now she must be happy.  When she wants that eleventh number in the sequence, the ninth and tenth will already be cached and ready to be added together to give 89 as the result.  One little goodie I snuck in there was binding the definition function to the generator so we can conveniently call it with the keyword, &lt;code&gt;this&lt;/code&gt;.  Also, using the &lt;code&gt;new&lt;/code&gt; operator is optional, though I find it more canonical to use since we are creating a &lt;em&gt;new&lt;/em&gt; generator when calling the constructor.&lt;/p&gt;
&lt;p&gt;When pushing the limits of our cool new sequence, our happy but unlikely programmer will eventually hit a brick wall of &amp;#8220;too much recursion&amp;#8221;, though how soon that occurs very much depends on the browser she is using.  Hopefully, when fed up with our simple solution, she&amp;#8217;ll fire up Firefox 3 to enjoy its native &lt;a href="firefox.[1"&gt;generator expressions in JavaScript 1.8&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;Array-like methods, such as &lt;code&gt;slice&lt;/code&gt; and &lt;code&gt;forEach&lt;/code&gt;, can be added to our generator, but that will be left as an exercise for the reader (unless you pay me).&lt;/p&gt;
&lt;p class="footnote" id="fn1"&gt;&lt;sup&gt;1&lt;/sup&gt; For more of the bleeding edge, read &lt;a href="http://ejohn.org/blog/javascript-18-progress/"&gt;John Resig&amp;#8217;s rundown of JavaScript 1.8&lt;/a&gt; and &lt;a href="http://developer.mozilla.org/en/New_in_JavaScript_1.7"&gt;Mozilla&amp;#8217;s coverage of JavaScript 1.7&lt;/a&gt;&lt;/p&gt;




</content>
		</entry>
	
 
</feed>
