<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Tao Effect Blog &#187; Thoughts</title>
	<atom:link href="http://www.taoeffect.com/blog/category/thoughts/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.taoeffect.com/blog</link>
	<description>Notice the Tao Effects...</description>
	<lastBuildDate>Fri, 03 Feb 2012 17:58:58 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Better Objective-C through Clojure Philosophy</title>
		<link>http://www.taoeffect.com/blog/2011/05/better-objective-c-through-clojure-philosophy/</link>
		<comments>http://www.taoeffect.com/blog/2011/05/better-objective-c-through-clojure-philosophy/#comments</comments>
		<pubDate>Sun, 08 May 2011 19:34:39 +0000</pubDate>
		<dc:creator>Greg Slepak</dc:creator>
				<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Thoughts]]></category>
		<category><![CDATA[clojure]]></category>
		<category><![CDATA[greg]]></category>
		<category><![CDATA[lisp]]></category>

		<guid isPermaLink="false">http://www.taoeffect.com/blog/?p=2519</guid>
		<description><![CDATA[Ever since discovering Lisp, I&#8217;ve felt an almost&#8230; loathing for other languages. They make things too complicated. You feel that other languages encourage code that ends up ugly, verbose.. inelegant. This feeling is so well known, it even has a name, the &#8220;The Lisp Snob&#8220;. Well, I&#8217;m quite sorry, but I think it&#8217;s too late [...]]]></description>
			<content:encoded><![CDATA[<p>Ever since <a href="/blog/2010/01/how-newlisp-took-my-breath-and-syntax-away/">discovering Lisp</a>, I&#8217;ve felt an almost&#8230; <i style="color:inherit">loathing</i> for other languages. They make things too complicated. You feel that other languages encourage code that ends up ugly, verbose.. inelegant. This feeling is so well known, it even has a name, the &#8220;<a href="https://encrypted.google.com/search?q=lisp+snob&#038;ie=utf-8">The Lisp Snob</a>&#8220;. Well, I&#8217;m quite sorry, but I think it&#8217;s too late for me, I&#8217;ve succumbed to the snobbery!</p>
<p>It&#8217;s possible, however, to bring over some of the ideas from the Land of Lisp to other languages. Indeed this is essentially what has been happening for the past several decades, people just call it something different (&#8220;a new language&#8221;, or &#8220;new features&#8221;). Today, I&#8217;d like to show what happens when you bring one such idea to Objective-C:</p>
<blockquote class="oneliner">
<p style="font-style:italic">It is better to have 100 functions operate on one data structure than 10 functions on 10 data structures.</p>
<p class="author">&mdash;Alan Perlis</p>
</blockquote>
<p><b><a href="https://github.com/Perspx/PXSourceList">PXSourceList</a></b> is a wonderful and popular Cocoa view for creating iTunes-like source lists created by <a href="http://perspx.com/">Alex Rozanski</a>:</p>
<p><center><img src="http://www.taoeffect.com/blog/wp-content/uploads/2011/05/PXSourceList.png" alt="" title="PXSourceList" width="530" height="343" class="alignnone size-full wp-image-2524" /></center></p>
<p>Unfortunately, the example code that created the screenshot above suffers from a very common programming paradigm called Object Oriented Programming (OOP). The OOP paradigm has dominated Earth&#8217;s developers for the past several decades. I used to follow (and <i>teach!</i>) it, but after learning Clojure, I&#8217;ve changed my mind. I now agree with the Alex Rozanski quote above and <a href="https://secure.wikimedia.org/wikipedia/en/wiki/Rich_Hickey">Rich Hickey</a>: it is better to have a small number of core data structures (preferably immutable) that are manipulated by hundreds of functions.</p>
<p>For this post, I will focus on just one of the many benefits of dropping the OOP perspective: <b>code brevity</b>.</p>
<p>The chief source responsible for the screenshot above is copied below. My point here isn&#8217;t to ask you to actually read through all of it, just note its size.</p>
<h3>Instead of this:</h3>
<pre class="code"><span class="source source_objc"><span class="comment comment_line comment_line_double-slash comment_line_double-slash_c++"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_c">//</span> =========================
</span><span class="comment comment_line comment_line_double-slash comment_line_double-slash_c++"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_c">//</span> = File SourceListItem.h =
</span><span class="comment comment_line comment_line_double-slash comment_line_double-slash_c++"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_c">//</span> =========================
</span>
<span class="meta meta_preprocessor meta_preprocessor_c meta_preprocessor_c_include">#<span class="keyword keyword_control keyword_control_import keyword_control_import_include keyword_control_import_include_c">import</span> <span class="string string_quoted string_quoted_other string_quoted_other_lt-gt string_quoted_other_lt-gt_include string_quoted_other_lt-gt_include_c"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_c">&lt;</span>Cocoa/Cocoa.h<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_c">&gt;</span></span></span>

<span class="meta meta_interface-or-protocol meta_interface-or-protocol_objc"><span class="storage storage_type storage_type_objc"><span class="punctuation punctuation_definition punctuation_definition_storage punctuation_definition_storage_type punctuation_definition_storage_type_objc">@</span>interface</span> <span class="entity entity_name entity_name_type entity_name_type_objc">SourceListItem</span> <span class="punctuation punctuation_definition punctuation_definition_entity punctuation_definition_entity_other punctuation_definition_entity_other_inherited-class punctuation_definition_entity_other_inherited-class_objc">:</span> <span class="entity entity_other entity_other_inherited-class entity_other_inherited-class_objc">NSObject</span><span class="meta meta_divider meta_divider_objc"> </span><span class="meta meta_scope meta_scope_interface meta_scope_interface_objc">{
    <span class="support support_class support_class_cocoa">NSString</span> *title;
    <span class="support support_class support_class_cocoa">NSString</span> *identifier;
    <span class="support support_class support_class_cocoa">NSImage</span> *icon;
    NSInteger badgeValue;

    <span class="support support_class support_class_cocoa">NSArray</span> *children;
}

@property (nonatomic, copy) <span class="support support_class support_class_cocoa">NSString</span> *title;
@property (nonatomic, copy) <span class="support support_class support_class_cocoa">NSString</span> *identifier;
@property (nonatomic, retain) <span class="support support_class support_class_cocoa">NSImage</span> *icon;
@property NSInteger badgeValue;

@property (nonatomic, copy) <span class="support support_class support_class_cocoa">NSArray</span> *children;

<span class="comment comment_line comment_line_double-slash comment_line_double-slash_c++"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_c">//</span>Convenience methods
</span><span class="meta meta_function meta_function_objc">+ <span class="meta meta_return-type meta_return-type_objc"><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_objc">id</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="entity entity_name entity_name_function entity_name_function_objc">itemWithTitle</span></span><span class="meta meta_argument-type meta_argument-type_objc"><span class="entity entity_name entity_name_function entity_name_function_name-of-parameter entity_name_function_name-of-parameter_objc"><span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="support support_class support_class_cocoa">NSString</span>*<span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_objc">aTitle</span></span> <span class="entity entity_name entity_name_function entity_name_function_name-of-parameter entity_name_function_name-of-parameter_objc">identifier</span><span class="meta meta_argument-type meta_argument-type_objc"><span class="entity entity_name entity_name_function entity_name_function_name-of-parameter entity_name_function_name-of-parameter_objc"><span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="support support_class support_class_cocoa">NSString</span>*<span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_objc">anIdentifier</span></span>;</span>
<span class="meta meta_function meta_function_objc">+ <span class="meta meta_return-type meta_return-type_objc"><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_objc">id</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="entity entity_name entity_name_function entity_name_function_objc">itemWithTitle</span></span><span class="meta meta_argument-type meta_argument-type_objc"><span class="entity entity_name entity_name_function entity_name_function_name-of-parameter entity_name_function_name-of-parameter_objc"><span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="support support_class support_class_cocoa">NSString</span>*<span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_objc">aTitle</span></span> <span class="entity entity_name entity_name_function entity_name_function_name-of-parameter entity_name_function_name-of-parameter_objc">identifier</span><span class="meta meta_argument-type meta_argument-type_objc"><span class="entity entity_name entity_name_function entity_name_function_name-of-parameter entity_name_function_name-of-parameter_objc"><span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="support support_class support_class_cocoa">NSString</span>*<span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_objc">anIdentifier</span></span> <span class="entity entity_name entity_name_function entity_name_function_name-of-parameter entity_name_function_name-of-parameter_objc">icon</span><span class="meta meta_argument-type meta_argument-type_objc"><span class="entity entity_name entity_name_function entity_name_function_name-of-parameter entity_name_function_name-of-parameter_objc"><span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="support support_class support_class_cocoa">NSImage</span>*<span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_objc">anIcon</span></span>;</span>

<span class="meta meta_function meta_function_objc">- <span class="meta meta_return-type meta_return-type_objc"><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_objc">BOOL</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="entity entity_name entity_name_function entity_name_function_objc">hasBadge</span></span>;</span>
<span class="meta meta_function meta_function_objc">- <span class="meta meta_return-type meta_return-type_objc"><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_objc">BOOL</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="entity entity_name entity_name_function entity_name_function_objc">hasChildren</span></span>;</span>
<span class="meta meta_function meta_function_objc">- <span class="meta meta_return-type meta_return-type_objc"><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_objc">BOOL</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="entity entity_name entity_name_function entity_name_function_objc">hasIcon</span></span>;</span>

</span><span class="storage storage_type storage_type_objc"><span class="punctuation punctuation_definition punctuation_definition_storage punctuation_definition_storage_type punctuation_definition_storage_type_objc">@</span>end</span></span>

<span class="comment comment_line comment_line_double-slash comment_line_double-slash_c++"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_c">//</span> =========================
</span><span class="comment comment_line comment_line_double-slash comment_line_double-slash_c++"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_c">//</span> = File SourceListItem.m =
</span><span class="comment comment_line comment_line_double-slash comment_line_double-slash_c++"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_c">//</span> =========================
</span>
<span class="meta meta_preprocessor meta_preprocessor_c meta_preprocessor_c_include">#<span class="keyword keyword_control keyword_control_import keyword_control_import_include keyword_control_import_include_c">import</span> <span class="string string_quoted string_quoted_double string_quoted_double_include string_quoted_double_include_c"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_c">"</span>SourceListItem.h<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_c">"</span></span></span>

<span class="meta meta_implementation meta_implementation_objc"><span class="storage storage_type storage_type_objc"><span class="punctuation punctuation_definition punctuation_definition_storage punctuation_definition_storage_type punctuation_definition_storage_type_objc">@</span>implementation</span> <span class="entity entity_name entity_name_type entity_name_type_objc">SourceListItem</span>
<span class="meta meta_scope meta_scope_implementation meta_scope_implementation_objc">
@synthesize title;
@synthesize identifier;
@synthesize icon;
@synthesize badgeValue;
@synthesize children;

<span class="meta meta_section"><span class="meta meta_preprocessor meta_preprocessor_c">#<span class="keyword keyword_control keyword_control_import keyword_control_import_pragma keyword_control_import_pragma_c">pragma mark</span> <span class="meta meta_toc-list meta_toc-list_pragma-mark meta_toc-list_pragma-mark_c">-</span></span></span>
<span class="meta meta_section"><span class="meta meta_preprocessor meta_preprocessor_c">#<span class="keyword keyword_control keyword_control_import keyword_control_import_pragma keyword_control_import_pragma_c">pragma mark</span> <span class="meta meta_toc-list meta_toc-list_pragma-mark meta_toc-list_pragma-mark_c">Init/Dealloc/Finalize</span></span></span>

<span class="meta meta_function meta_function_objc">- <span class="meta meta_return-type meta_return-type_objc"><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_objc">id</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="entity entity_name entity_name_function entity_name_function_objc">init</span></span>
</span>{
    <span class="keyword keyword_control keyword_control_c">if</span>(<span class="variable variable_language variable_language_objc">self</span>=<span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span><span class="variable variable_language variable_language_objc">super</span> <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">init</span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span>)
    {
        badgeValue = -<span class="constant constant_numeric constant_numeric_c">1</span>;    <span class="comment comment_line comment_line_double-slash comment_line_double-slash_c++"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_c">//</span>We don't want a badge value by default
</span>    }

    <span class="keyword keyword_control keyword_control_c">return</span> <span class="variable variable_language variable_language_objc">self</span>;
}

<span class="meta meta_function meta_function_objc">+ <span class="meta meta_return-type meta_return-type_objc"><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_objc">id</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="entity entity_name entity_name_function entity_name_function_objc">itemWithTitle</span></span><span class="meta meta_argument-type meta_argument-type_objc"><span class="entity entity_name entity_name_function entity_name_function_name-of-parameter entity_name_function_name-of-parameter_objc"><span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="support support_class support_class_cocoa">NSString</span>*<span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_objc">aTitle</span></span> <span class="entity entity_name entity_name_function entity_name_function_name-of-parameter entity_name_function_name-of-parameter_objc">identifier</span><span class="meta meta_argument-type meta_argument-type_objc"><span class="entity entity_name entity_name_function entity_name_function_name-of-parameter entity_name_function_name-of-parameter_objc"><span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="support support_class support_class_cocoa">NSString</span>*<span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_objc">anIdentifier</span></span>
</span>{
    SourceListItem *item = <span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span>SourceListItem <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">itemWithTitle<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span>aTitle <span class="support support_function support_function_any-method support_function_any-method_name-of-parameter support_function_any-method_name-of-parameter_objc">identifier<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span>anIdentifier <span class="support support_function support_function_any-method support_function_any-method_name-of-parameter support_function_any-method_name-of-parameter_objc">icon<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="constant constant_language constant_language_objc">nil</span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span>;

    <span class="keyword keyword_control keyword_control_c">return</span> item;
}

<span class="meta meta_function meta_function_objc">+ <span class="meta meta_return-type meta_return-type_objc"><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_objc">id</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="entity entity_name entity_name_function entity_name_function_objc">itemWithTitle</span></span><span class="meta meta_argument-type meta_argument-type_objc"><span class="entity entity_name entity_name_function entity_name_function_name-of-parameter entity_name_function_name-of-parameter_objc"><span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="support support_class support_class_cocoa">NSString</span>*<span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_objc">aTitle</span></span> <span class="entity entity_name entity_name_function entity_name_function_name-of-parameter entity_name_function_name-of-parameter_objc">identifier</span><span class="meta meta_argument-type meta_argument-type_objc"><span class="entity entity_name entity_name_function entity_name_function_name-of-parameter entity_name_function_name-of-parameter_objc"><span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="support support_class support_class_cocoa">NSString</span>*<span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_objc">anIdentifier</span></span> <span class="entity entity_name entity_name_function entity_name_function_name-of-parameter entity_name_function_name-of-parameter_objc">icon</span><span class="meta meta_argument-type meta_argument-type_objc"><span class="entity entity_name entity_name_function entity_name_function_name-of-parameter entity_name_function_name-of-parameter_objc"><span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="support support_class support_class_cocoa">NSImage</span>*<span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_objc">anIcon</span></span>
</span>{
    SourceListItem *item = <span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span><span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span><span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span>SourceListItem <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">alloc</span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span> <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">init</span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span> <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">autorelease</span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span>;

    <span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span>item <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">setTitle<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span>aTitle</span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span>;
    <span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span>item <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">setIdentifier<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span>anIdentifier</span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span>;
    <span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span>item <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">setIcon<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span>anIcon</span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span>;

    <span class="keyword keyword_control keyword_control_c">return</span> item;
}

<span class="meta meta_function meta_function_objc">- <span class="meta meta_return-type meta_return-type_objc"><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_c">void</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="entity entity_name entity_name_function entity_name_function_objc">dealloc</span></span>
</span>{
    <span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span>title <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">release</span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span>;
    <span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span>identifier <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">release</span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span>;
    <span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span>icon <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">release</span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span>;
    <span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span>children <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">release</span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span>;

    <span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span><span class="variable variable_language variable_language_objc">super</span> <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">dealloc</span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span>;
}

<span class="meta meta_function meta_function_objc">- <span class="meta meta_return-type meta_return-type_objc"><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_c">void</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="entity entity_name entity_name_function entity_name_function_objc">finalize</span></span>
</span>{
    title = <span class="constant constant_language constant_language_objc">nil</span>;
    identifier = <span class="constant constant_language constant_language_objc">nil</span>;
    icon = <span class="constant constant_language constant_language_objc">nil</span>;
    children = <span class="constant constant_language constant_language_objc">nil</span>;

    <span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span><span class="variable variable_language variable_language_objc">super</span> <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">finalize</span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span>;
}

<span class="meta meta_section"><span class="meta meta_preprocessor meta_preprocessor_c">#<span class="keyword keyword_control keyword_control_import keyword_control_import_pragma keyword_control_import_pragma_c">pragma mark</span> <span class="meta meta_toc-list meta_toc-list_pragma-mark meta_toc-list_pragma-mark_c">-</span></span></span>
<span class="meta meta_section"><span class="meta meta_preprocessor meta_preprocessor_c">#<span class="keyword keyword_control keyword_control_import keyword_control_import_pragma keyword_control_import_pragma_c">pragma mark</span> <span class="meta meta_toc-list meta_toc-list_pragma-mark meta_toc-list_pragma-mark_c">Custom Accessors</span></span></span>

<span class="meta meta_function meta_function_objc">- <span class="meta meta_return-type meta_return-type_objc"><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_objc">BOOL</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="entity entity_name entity_name_function entity_name_function_objc">hasBadge</span></span>
</span>{
    <span class="keyword keyword_control keyword_control_c">return</span> badgeValue!=-<span class="constant constant_numeric constant_numeric_c">1</span>;
}

<span class="meta meta_function meta_function_objc">- <span class="meta meta_return-type meta_return-type_objc"><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_objc">BOOL</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="entity entity_name entity_name_function entity_name_function_objc">hasChildren</span></span>
</span>{
    <span class="keyword keyword_control keyword_control_c">return</span> <span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span>children <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">count</span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span>&gt;<span class="constant constant_numeric constant_numeric_c">0</span>;
}

<span class="meta meta_function meta_function_objc">- <span class="meta meta_return-type meta_return-type_objc"><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_objc">BOOL</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="entity entity_name entity_name_function entity_name_function_objc">hasIcon</span></span>
</span>{
    <span class="keyword keyword_control keyword_control_c">return</span> icon!=<span class="constant constant_language constant_language_objc">nil</span>;
}

</span><span class="storage storage_type storage_type_objc"><span class="punctuation punctuation_definition punctuation_definition_storage punctuation_definition_storage_type punctuation_definition_storage_type_objc">@</span>end</span></span>

<span class="comment comment_line comment_line_double-slash comment_line_double-slash_c++"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_c">//</span> ======================
</span><span class="comment comment_line comment_line_double-slash comment_line_double-slash_c++"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_c">//</span> = File AppDelegate.m =
</span><span class="comment comment_line comment_line_double-slash comment_line_double-slash_c++"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_c">//</span> ======================
</span>
<span class="meta meta_preprocessor meta_preprocessor_c meta_preprocessor_c_include">#<span class="keyword keyword_control keyword_control_import keyword_control_import_include keyword_control_import_include_c">import</span> <span class="string string_quoted string_quoted_double string_quoted_double_include string_quoted_double_include_c"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_c">"</span>AppDelegate.h<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_c">"</span></span></span>
<span class="meta meta_preprocessor meta_preprocessor_c meta_preprocessor_c_include">#<span class="keyword keyword_control keyword_control_import keyword_control_import_include keyword_control_import_include_c">import</span> <span class="string string_quoted string_quoted_double string_quoted_double_include string_quoted_double_include_c"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_c">"</span>SourceListItem.h<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_c">"</span></span></span>

<span class="meta meta_implementation meta_implementation_objc"><span class="storage storage_type storage_type_objc"><span class="punctuation punctuation_definition punctuation_definition_storage punctuation_definition_storage_type punctuation_definition_storage_type_objc">@</span>implementation</span> <span class="entity entity_name entity_name_type entity_name_type_objc">AppDelegate</span>
<span class="meta meta_scope meta_scope_implementation meta_scope_implementation_objc">
<span class="meta meta_section"><span class="meta meta_preprocessor meta_preprocessor_c">#<span class="keyword keyword_control keyword_control_import keyword_control_import_pragma keyword_control_import_pragma_c">pragma mark</span> <span class="meta meta_toc-list meta_toc-list_pragma-mark meta_toc-list_pragma-mark_c">-</span></span></span>
<span class="meta meta_section"><span class="meta meta_preprocessor meta_preprocessor_c">#<span class="keyword keyword_control keyword_control_import keyword_control_import_pragma keyword_control_import_pragma_c">pragma mark</span> <span class="meta meta_toc-list meta_toc-list_pragma-mark meta_toc-list_pragma-mark_c">Init/Dealloc</span></span></span>

<span class="meta meta_function meta_function_objc">- <span class="meta meta_return-type meta_return-type_objc"><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_c">void</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="entity entity_name entity_name_function entity_name_function_objc">awakeFromNib</span></span>
</span>{
    <span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span>selectedItemLabel <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">setStringValue<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>(none)<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span>;

    sourceListItems = <span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span><span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span><span class="support support_class support_class_cocoa">NSMutableArray</span> <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">alloc</span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span> <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">init</span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span>;

    <span class="comment comment_line comment_line_double-slash comment_line_double-slash_c++"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_c">//</span>Set up the "Library" parent item and children
</span>    SourceListItem *libraryItem = <span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span>SourceListItem <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">itemWithTitle<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>LIBRARY<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span> <span class="support support_function support_function_any-method support_function_any-method_name-of-parameter support_function_any-method_name-of-parameter_objc">identifier<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>library<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span>;
    SourceListItem *musicItem = <span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span>SourceListItem <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">itemWithTitle<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>Music<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span> <span class="support support_function support_function_any-method support_function_any-method_name-of-parameter support_function_any-method_name-of-parameter_objc">identifier<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>music<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span>;
    <span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span>musicItem <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">setIcon<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span><span class="support support_class support_class_cocoa">NSImage</span> <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">imageNamed<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>music.png<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span>;
    SourceListItem *moviesItem = <span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span>SourceListItem <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">itemWithTitle<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>Movies<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span> <span class="support support_function support_function_any-method support_function_any-method_name-of-parameter support_function_any-method_name-of-parameter_objc">identifier<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>movies<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span>;
    <span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span>moviesItem <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">setIcon<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span><span class="support support_class support_class_cocoa">NSImage</span> <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">imageNamed<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>movies.png<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span>;
    SourceListItem *podcastsItem = <span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span>SourceListItem <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">itemWithTitle<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>Podcasts<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span> <span class="support support_function support_function_any-method support_function_any-method_name-of-parameter support_function_any-method_name-of-parameter_objc">identifier<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>podcasts<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span>;
    <span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span>podcastsItem <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">setIcon<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span><span class="support support_class support_class_cocoa">NSImage</span> <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">imageNamed<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>podcasts.png<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span>;
    <span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span>podcastsItem <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">setBadgeValue<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="constant constant_numeric constant_numeric_c">10</span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span>;
    SourceListItem *audiobooksItem = <span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span>SourceListItem <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">itemWithTitle<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>Audiobooks<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span> <span class="support support_function support_function_any-method support_function_any-method_name-of-parameter support_function_any-method_name-of-parameter_objc">identifier<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>audiobooks<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span>;
    <span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span>audiobooksItem <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">setIcon<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span><span class="support support_class support_class_cocoa">NSImage</span> <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">imageNamed<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>audiobooks.png<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span>;
    <span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span>libraryItem <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">setChildren<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span><span class="support support_class support_class_cocoa">NSArray</span> <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">arrayWithObjects<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span>musicItem, moviesItem, podcastsItem,
                              audiobooksItem, <span class="constant constant_language constant_language_objc">nil</span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span>;

    <span class="comment comment_line comment_line_double-slash comment_line_double-slash_c++"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_c">//</span>Set up the "Playlists" parent item and children
</span>    SourceListItem *playlistsItem = <span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span>SourceListItem <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">itemWithTitle<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>PLAYLISTS<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span> <span class="support support_function support_function_any-method support_function_any-method_name-of-parameter support_function_any-method_name-of-parameter_objc">identifier<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>playlists<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span>;
    SourceListItem *playlist1Item = <span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span>SourceListItem <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">itemWithTitle<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>Playlist1<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span> <span class="support support_function support_function_any-method support_function_any-method_name-of-parameter support_function_any-method_name-of-parameter_objc">identifier<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>playlist1<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span>;

    <span class="comment comment_line comment_line_double-slash comment_line_double-slash_c++"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_c">//</span>Create a second-level group to demonstrate
</span>    SourceListItem *playlist2Item = <span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span>SourceListItem <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">itemWithTitle<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>Playlist2<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span> <span class="support support_function support_function_any-method support_function_any-method_name-of-parameter support_function_any-method_name-of-parameter_objc">identifier<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>playlist2<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span>;
    SourceListItem *playlist3Item = <span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span>SourceListItem <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">itemWithTitle<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>Playlist3<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span> <span class="support support_function support_function_any-method support_function_any-method_name-of-parameter support_function_any-method_name-of-parameter_objc">identifier<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>playlist3<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span>;
    <span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span>playlist1Item <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">setIcon<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span><span class="support support_class support_class_cocoa">NSImage</span> <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">imageNamed<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>playlist.png<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span>;
    <span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span>playlist2Item <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">setIcon<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span><span class="support support_class support_class_cocoa">NSImage</span> <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">imageNamed<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>playlist.png<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span>;
    <span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span>playlist3Item <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">setIcon<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span><span class="support support_class support_class_cocoa">NSImage</span> <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">imageNamed<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>playlist.png<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span>;

    SourceListItem *playlistGroup = <span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span>SourceListItem <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">itemWithTitle<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>Playlist Group<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span> <span class="support support_function support_function_any-method support_function_any-method_name-of-parameter support_function_any-method_name-of-parameter_objc">identifier<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>playlistgroup<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span>;
    SourceListItem *playlistGroupItem = <span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span>SourceListItem <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">itemWithTitle<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>Child Playlist<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span> <span class="support support_function support_function_any-method support_function_any-method_name-of-parameter support_function_any-method_name-of-parameter_objc">identifier<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>childplaylist<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span>;
    <span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span>playlistGroup <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">setIcon<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span><span class="support support_class support_class_cocoa">NSImage</span> <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">imageNamed<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>playlistFolder.png<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span>;
    <span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span>playlistGroupItem <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">setIcon<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span><span class="support support_class support_class_cocoa">NSImage</span> <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">imageNamed<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>playlist.png<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span>;
    <span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span>playlistGroup <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">setChildren<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span><span class="support support_class support_class_cocoa">NSArray</span> <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">arrayWithObject<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span>playlistGroupItem</span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span>;

    <span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span>playlistsItem <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">setChildren<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span><span class="support support_class support_class_cocoa">NSArray</span> <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">arrayWithObjects<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span>playlist1Item, playlistGroup,playlist2Item,
                                playlist3Item, <span class="constant constant_language constant_language_objc">nil</span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span>;

    <span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span>sourceListItems <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">addObject<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span>libraryItem</span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span>;
    <span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span>sourceListItems <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">addObject<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span>playlistsItem</span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span>;

    <span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span>sourceList <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">reloadData</span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span>;
}
</span></span></span></pre>
<h3>By using &#8220;special&#8221; dictionaries, we can greatly reduce code size, and enhance flexibility</h3>
<p>Clojure has the concept of &#8220;records&#8221;. These are basically &#8220;special dictionaries&#8221; (AKA maps). Clojure uses maps/dictionaries all over the place, because it realizes that it&#8217;s not only not necessary to create a new class for every type of data you have, but it&#8217;s <i>counter-productive</i>.</p>
<p>Today I spent some time adapting the idea of Clojure&#8217;s records into its Objective-C equivalent simply through the creation of categories on the NSDictionary and NSMutableDictionary classes. The result is that I was able to reproduce the screenshot above with the following code (equivalent sections to the ones above):</p>
<pre class="code"><span class="source source_objc"><span class="comment comment_line comment_line_double-slash comment_line_double-slash_c++"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_c">//</span> ======================
</span><span class="comment comment_line comment_line_double-slash comment_line_double-slash_c++"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_c">//</span> = File AppDelegate.m =
</span><span class="comment comment_line comment_line_double-slash comment_line_double-slash_c++"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_c">//</span> ======================
</span>
<span class="meta meta_preprocessor meta_preprocessor_c meta_preprocessor_c_include">#<span class="keyword keyword_control keyword_control_import keyword_control_import_include keyword_control_import_include_c">import</span> <span class="string string_quoted string_quoted_double string_quoted_double_include string_quoted_double_include_c"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_c">"</span>AppDelegate.h<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_c">"</span></span></span>

<span class="meta meta_interface-or-protocol meta_interface-or-protocol_objc"><span class="storage storage_type storage_type_objc"><span class="punctuation punctuation_definition punctuation_definition_storage punctuation_definition_storage_type punctuation_definition_storage_type_objc">@</span>protocol</span> <span class="entity entity_name entity_name_type entity_name_type_objc">SourceListItem</span>
<span class="meta meta_scope meta_scope_interface meta_scope_interface_objc">@property (nonatomic, retain) <span class="support support_class support_class_cocoa">NSString</span> *title;
@property (nonatomic, retain) <span class="support support_class support_class_cocoa">NSString</span> *identifier;
@property (nonatomic, retain) <span class="support support_class support_class_cocoa">NSNumber</span> *type;
@property (nonatomic, retain) <span class="support support_class support_class_cocoa">NSImage</span> *icon;
@property (nonatomic, retain) <span class="support support_class support_class_cocoa">NSMutableArray</span> *children;
</span><span class="storage storage_type storage_type_objc"><span class="punctuation punctuation_definition punctuation_definition_storage punctuation_definition_storage_type punctuation_definition_storage_type_objc">@</span>end</span></span>

<span class="meta meta_implementation meta_implementation_objc"><span class="storage storage_type storage_type_objc"><span class="punctuation punctuation_definition punctuation_definition_storage punctuation_definition_storage_type punctuation_definition_storage_type_objc">@</span>implementation</span> <span class="entity entity_name entity_name_type entity_name_type_objc">AppDelegate</span>
<span class="meta meta_scope meta_scope_implementation meta_scope_implementation_objc">
<span class="meta meta_function meta_function_objc">- <span class="meta meta_return-type meta_return-type_objc"><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_c">void</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="entity entity_name entity_name_function entity_name_function_objc">awakeFromNib</span></span>
</span>{
    sourceListItems = <span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span><span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span><span class="support support_class support_class_cocoa">NSMutableArray</span> <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">alloc</span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span> <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">initWithObjects<span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span>
<span class="meta meta_function-call meta_function-call_c"><span class="punctuation punctuation_whitespace punctuation_whitespace_function-call punctuation_whitespace_function-call_leading punctuation_whitespace_function-call_leading_c">                       </span><span class="support support_function support_function_any-method support_function_any-method_c">_MD</span>(</span><span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>title<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>, <span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>LIBRARY<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>,
                           <span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>identifier<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>, <span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>library<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>,
                           <span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>children<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>,
                           NSARY(<span class="meta meta_function-call meta_function-call_c"><span class="support support_function support_function_any-method support_function_any-method_c">_MD</span>(</span><span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>title<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>, <span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>Music<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>,
                                     <span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>identifier<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>, <span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>music<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>,
                                     <span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>icon<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>, NSIMG(<span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>music<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>)),
<span class="meta meta_function-call meta_function-call_c"><span class="punctuation punctuation_whitespace punctuation_whitespace_function-call punctuation_whitespace_function-call_leading punctuation_whitespace_function-call_leading_c">                                </span><span class="support support_function support_function_any-method support_function_any-method_c">_MD</span>(</span><span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>title<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>, <span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>Movies<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>,
                                    <span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>identifier<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>, <span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>movies<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>,
                                    <span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>icon<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>, NSIMG(<span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>movies<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>)),
<span class="meta meta_function-call meta_function-call_c"><span class="punctuation punctuation_whitespace punctuation_whitespace_function-call punctuation_whitespace_function-call_leading punctuation_whitespace_function-call_leading_c">                                 </span><span class="support support_function support_function_any-method support_function_any-method_c">_MD</span>(</span><span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>title<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>, <span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>Podcasts<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>,
                                     <span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>identifier<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>, <span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>podcasts<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>,
                                     <span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>icon<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>, NSIMG(<span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>podcasts<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>)),
<span class="meta meta_function-call meta_function-call_c"><span class="punctuation punctuation_whitespace punctuation_whitespace_function-call punctuation_whitespace_function-call_leading punctuation_whitespace_function-call_leading_c">                                 </span><span class="support support_function support_function_any-method support_function_any-method_c">_MD</span>(</span><span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>title<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>, <span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>Audiobooks<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>,
                                     <span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>identifier<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>, <span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>audiobooks<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>,
                                     <span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>icon<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>, NSIMG(<span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>audiobooks<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>)))),
<span class="meta meta_function-call meta_function-call_c"><span class="punctuation punctuation_whitespace punctuation_whitespace_function-call punctuation_whitespace_function-call_leading punctuation_whitespace_function-call_leading_c">                       </span><span class="support support_function support_function_any-method support_function_any-method_c">_MD</span>(</span><span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>title<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>, <span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>PLAYLISTS<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>,
                           <span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>identifier<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>, <span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>playlists<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>,
                           <span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>children<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>,
                           NSARY(<span class="meta meta_function-call meta_function-call_c"><span class="support support_function support_function_any-method support_function_any-method_c">_MD</span>(</span><span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>title<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>, <span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>Playlist1<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>,
                                     <span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>identifier<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>, <span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>playlist1<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>,
                                     <span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>icon<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>, NSIMG(<span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>playlist<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>)),
<span class="meta meta_function-call meta_function-call_c"><span class="punctuation punctuation_whitespace punctuation_whitespace_function-call punctuation_whitespace_function-call_leading punctuation_whitespace_function-call_leading_c">                                 </span><span class="support support_function support_function_any-method support_function_any-method_c">_MD</span>(</span><span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>title<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>, <span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>Playlist Group<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>,
                                     <span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>identifier<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>, <span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>playlistgroup<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>,
                                     <span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>icon<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>, NSIMG(<span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>playlistFolder<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>),
                                     <span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>children<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>,
                                     NSARY(<span class="meta meta_function-call meta_function-call_c"><span class="support support_function support_function_any-method support_function_any-method_c">_MD</span>(</span><span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>title<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>, <span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>Child Playlist<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>,
                                               <span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>identifier<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>, <span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>childplaylist<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>,
                                               <span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>icon<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>, NSIMG(<span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>playlist<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>)))),
<span class="meta meta_function-call meta_function-call_c"><span class="punctuation punctuation_whitespace punctuation_whitespace_function-call punctuation_whitespace_function-call_leading punctuation_whitespace_function-call_leading_c">                                 </span><span class="support support_function support_function_any-method support_function_any-method_c">_MD</span>(</span><span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>title<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>, <span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>Playlist1<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>,
                                     <span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>identifier<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>, <span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>playlist1<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>,
                                     <span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>icon<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>, NSIMG(<span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>playlist<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>)),
<span class="meta meta_function-call meta_function-call_c"><span class="punctuation punctuation_whitespace punctuation_whitespace_function-call punctuation_whitespace_function-call_leading punctuation_whitespace_function-call_leading_c">                                 </span><span class="support support_function support_function_any-method support_function_any-method_c">_MD</span>(</span><span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>title<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>, <span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>Playlist1<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>,
                                     <span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>identifier<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>, <span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>playlist1<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>,
                                     <span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>icon<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>, NSIMG(<span class="string string_quoted string_quoted_double string_quoted_double_objc"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_objc">@"</span>playlist<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_objc">"</span></span>)))),
                       <span class="constant constant_language constant_language_objc">nil</span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span>;
    <span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span>sourceList <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">reloadData</span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span>;
}
</span></span></span></pre>
<p>Not only is the code above more flexible and significantly shorter, but it&#8217;s clearer as well! You can practically <i>visualize the GUI&#8217;s structure from the code itself!</i></p>
<p>The rest of the code (related to the delegate methods) is essentially equivalent, except it&#8217;s again, shorter.</p>
<h3>&#8220;Magic&#8221; Dictionaries with Properties!</h3>
<p>Dictionaries are created using the <span class="code">_MD</span> and <span class="code">_D</span> macros (for creating mutable and immutable dictionaries, respectively). These are plain old standard Foundation dictionaries. They can be saved to the hard disk, read back, key-value coded, etc. The reason for the macros is code brevity and because they use a new <span class="code">dictionaryWithKeysAndObjects:</span> method that&#8217;s added to all dictionaries through the categories (I have no idea why Apple&#8217;s engineers throught it would be better to have values come before keys as with <span class="code">dictionaryWithObjectsAndKeys:</span>&#8230;).</p>
<p>Next, let&#8217;s have a look at how dictionary values are manipulated and obtained. Most semi-intelligent languages have a map literals and simple syntax for fetching and setting map key/value pairs. Objective-C has no such intelligence imparted to it. However, it does have the very nifty <span class="code">forwardInvocation:</span> mechanism. By combining <span class="code">forwardInvocation:</span> with Objective-C protocols and properties, it&#8217;s possible to create &#8220;Objective-C records&#8221;.</p>
<p>Instead of this:</p>
<pre class="code"><span class="source source_objc">- (NSUInteger)sourceList:(PXSourceList*)sourceList numberOfChildrenOfItem:(<span class="storage storage_type storage_type_objc">id</span>)item
{
    <span class="comment comment_line comment_line_double-slash comment_line_double-slash_c++"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_c">//</span>Works the same way as the NSOutlineView data source: `nil` means a parent item
</span>    <span class="keyword keyword_control keyword_control_c">if</span>(item==<span class="constant constant_language constant_language_objc">nil</span>) {
        <span class="keyword keyword_control keyword_control_c">return</span> <span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span>sourceListItems <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">count</span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span>;
    }
    <span class="keyword keyword_control keyword_control_c">else</span> {
        <span class="keyword keyword_control keyword_control_c">return</span> <span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span><span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span>item <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">children</span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span> <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">count</span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span>;
    }
}</span></pre>
<p>We can now use the dot-syntax notation to do this:</p>
<pre class="code"><span class="source source_objc">- (NSUInteger)sourceList:(PXSourceList*)sourceList numberOfChildrenOfItem:(<span class="meta meta_id-with-protocol meta_id-with-protocol_objc"><span class="storage storage_type storage_type_objc">id</span><span class="meta meta_protocol-list meta_protocol-list_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">&lt;</span>SourceListItem<span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">&gt;</span></span></span>)item
{
    <span class="keyword keyword_control keyword_control_c">return</span> item ? <span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span>item.children <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">count</span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span> : <span class="meta meta_bracketed meta_bracketed_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">[</span>sourceListItems <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">count</span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">]</span></span>;
}</span></pre>
<p>Behind the scenes, <span class="code">item.children</span> is turned into <span class="code">[item objectForKey:@"children"]</span>.</p>
<p>Setting values is also done through the standard dot-notation of Objective-C properties:</p>
<pre class="code"><span class="source source_objc">- (<span class="storage storage_type storage_type_c">void</span>)sourceList:(PXSourceList*)aSourceList setObjectValue:(<span class="storage storage_type storage_type_objc">id</span>)object forItem:(<span class="meta meta_id-with-protocol meta_id-with-protocol_objc"><span class="storage storage_type storage_type_objc">id</span><span class="meta meta_protocol-list meta_protocol-list_objc"><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_begin punctuation_section_scope_begin_objc">&lt;</span>SourceListItem<span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_end punctuation_section_scope_end_objc">&gt;</span></span></span>)item
{
    item.title = object;
}</span></pre>
<h3>Grab on Github</h3>
<p>You&#8217;ll find the project for <a href="https://github.com/taoeffect/TERecord">TERecord here</a>, and the converted example of PXSourceList <a href="https://github.com/taoeffect/PXSourceList">here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.taoeffect.com/blog/2011/05/better-objective-c-through-clojure-philosophy/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Existing iPhone Apps Breaking the TOS</title>
		<link>http://www.taoeffect.com/blog/2010/04/existing-iphone-apps-breaking-the-tos/</link>
		<comments>http://www.taoeffect.com/blog/2010/04/existing-iphone-apps-breaking-the-tos/#comments</comments>
		<pubDate>Mon, 12 Apr 2010 22:38:21 +0000</pubDate>
		<dc:creator>Greg Slepak</dc:creator>
				<category><![CDATA[Thoughts]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[FuckingAppStore]]></category>
		<category><![CDATA[greg]]></category>
		<category><![CDATA[hypocrisy]]></category>
		<category><![CDATA[iPhone SDK]]></category>

		<guid isPermaLink="false">http://www.taoeffect.com/blog/?p=2083</guid>
		<description><![CDATA[Wow. It looks like someone made a Google Docs spreadsheet of existing iPhone applications breaking the TOS. Some of these &#8220;sub-standard&#8221; applications appear to include: The popular Rolando 2 for breaking 3.3.1 and 3.3.2 (Lua interpreter) Zombieville, #1 in all Games for a while, a Unity3D game (breaking 3.3.1) Ravensword: The Fallen King, #1 in [...]]]></description>
			<content:encoded><![CDATA[<p>Wow. It looks like someone made a Google Docs spreadsheet of <a href="https://spreadsheets.google.com/ccc?key=0ApLAS6djiVwydGhJMmh1YjYwb0QzUDl6dEVzV1hwVnc&#038;hl=en">existing iPhone applications breaking the TOS</a>.</p>
<p>Some of these <a href="http://www.taoeffect.com/blog/2010/04/steve-jobs-response-on-section-3-3-1/">&#8220;sub-standard&#8221; applications</a> appear to include:</p>
<ul>
<li>The popular <a href="http://topappcharts.com/321084051/app-details-rolando-2-quest-for-the-golden-orchid.php">Rolando 2</a> for breaking 3.3.1 and 3.3.2 (Lua interpreter)</li>
<li><a href="http://www.topappcharts.com/304871622/app-details-zombieville-usa.php">Zombieville</a>, #1 in all Games for a while, a Unity3D game (breaking 3.3.1)</li>
<li><a href="http://www.topappcharts.com/335594384/app-details-ravensword-the-fallen-king.php">Ravensword: The Fallen King</a>, #1 in Role-Playing at one point, also a Unity3D game.</li>
<li><a href="http://itunes.apple.com/us/app/broken-sword-directors-cut/id350353259?mt=8">Broken Sword</a>, a top-selling RPG game, for apparently using the <a href="http://en.wikipedia.org/wiki/SCUMM">SCUMM scripting language</a></li>
<li>And yes, it turns out that <a href="http://www.google.com/search?q=tap+tap+revenge">Tap Tap Revenge</a> <a href="http://arstechnica.com/apple/news/2010/04/steve-jobs-weighs-on-iphone-os-dev-controversy.ars">does indeed violate both 3.3.1 and 3.3.2 for using Lua</a></li>
<li><a href="http://topappcharts.com/333225329/app-details-command-conquer-red-alert.php">Command &#038; Conquer Red Alert</a> and <a href="http://topappcharts.com/290461039/app-details-star-wars-the-force-unleashed.php">Star Wars The Force Unleashed</a> both seem to interpret proprietary scripts, violating 3.3.2.</li>
</ul>
<p>It will be interesting to see how Apple responds to this. If they ignore it, is that essentially a green light to break their TOS, so long as you&#8217;re not on their shitlist and your name doesn&#8217;t begin with an &#8216;A&#8217; and end in &#8216;dobe&#8217;?</p>
<p>This type of selective enforcement and hypocrisy does not breed developer loyalty and trust, rather, it fosters animosity and <a href="http://en.wikipedia.org/wiki/Fear,_uncertainty_and_doubt" target="_blank">FUD</a>.</p>
<p>Just in case <a href="https://spreadsheets.google.com/ccc?key=0ApLAS6djiVwydGhJMmh1YjYwb0QzUDl6dEVzV1hwVnc&#038;hl=en">the Google Docs link</a> goes down here&#8217;s a mirror: (<a href="http://cdn.taoeffect.com/other/iPhoneAppsBreakingTheTOS.pdf">PDF</a> | <a href="http://cdn.taoeffect.com/other/iPhoneAppsBreakingTheTOS.xls">XLS</a>).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.taoeffect.com/blog/2010/04/existing-iphone-apps-breaking-the-tos/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Steve Jobs&#8217; Response: A Brief Followup</title>
		<link>http://www.taoeffect.com/blog/2010/04/steve-jobs-response-a-brief-followup/</link>
		<comments>http://www.taoeffect.com/blog/2010/04/steve-jobs-response-a-brief-followup/#comments</comments>
		<pubDate>Sun, 11 Apr 2010 18:09:34 +0000</pubDate>
		<dc:creator>Greg Slepak</dc:creator>
				<category><![CDATA[Thoughts]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[greg]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iPhone SDK]]></category>
		<category><![CDATA[Steve Jobs]]></category>

		<guid isPermaLink="false">http://www.taoeffect.com/blog/?p=2030</guid>
		<description><![CDATA[The attention that yesterday&#8217;s post received is astounding, but unfortunately from the looks of it a lot of people seem to have a poor understanding of the situation. I feel compelled to address some of the sticking points. On MonoTouch and other 3rd Party Tools Some people appear to be under the mistaken impression that [...]]]></description>
			<content:encoded><![CDATA[<p>The attention that <a href="/blog/2010/04/steve-jobs-response-on-section-3-3-1/">yesterday&#8217;s post</a> received is astounding, but unfortunately from the looks of it a lot of people seem to have a poor understanding of the situation. I feel compelled to address some of the sticking points.</p>
<h4>On MonoTouch and other 3rd Party Tools</h4>
<p>Some people appear to be under the mistaken impression that these changes are designed to prevent Java-like &#8220;non-native&#8221; UIs on the iPhone.</p>
<p>To be clear, the situation on the iPhone is completely different from that of the Mac. From the user&#8217;s perspective, you cannot tell the difference between an application written using <a href="http://monotouch.net/">MonoTouch</a> or <a href="http://www.nimblekit.com/">NimbleKit</a> or <a href="http://unity3d.com/">Unity3D</a> (non-Apple sanctioned tools that allow developers to code for the iPhone in non-C languages), and those written using Apple&#8217;s tools and Objective-C.</p>
<p><b>They look and feel <a href="http://blog.kevfoo.com/index.php/2009/11/monotouch-uialertview-uitextfield-crazy-delicious">exactly</a> <a href="http://ksheffield.com/blog/?p=22">the same</a>.</b></p>
<p><img src="http://www.taoeffect.com/blog/wp-content/uploads/2010/04/unity-logo.png" alt="" title="Unity3D Logo" width="73" height="73" class="alignright size-full wp-image-2035" style="float:right; padding-left: 10px; padding-bottom:20px" />This is because they&#8217;re all using Apple&#8217;s UIKit to display the UI. In the case of Unity3D, which produces OpenGL games, you can&#8217;t tell whether the game was made using Unity3D or directly in Xcode, so it&#8217;s dubious that this is solely about &#8220;quality control&#8221; and keeping a uniform UI. If that was their sole motivation they could simply mandate that all non-OpenGL user interfaces make use of the native Cocoa frameworks and widgets.</p>
<p>Is it possible that these applications might be somehow better, perhaps faster, were they written directly with Apple&#8217;s tools? Maybe. Is that reason enough to outright ban them though? There are already <a href="http://blogs.unity3d.com/2010/04/10/unity-and-the-iphone-os-4-0/">hundreds of apps</a> on the AppStore built using Unity3D, some of which are best-sellers.</p>
<p><center>
<div class="img"><img src="http://www.taoeffect.com/blog/wp-content/uploads/2010/04/SteveTapTap.png" alt="" title="" width="500" height="296" class="alignright size-full wp-image-2038" /></div>
<p></center></p>
<p>There appear to be rumors online that even the Tap Tap Revenge game that Steve demoed during the iPhone 4.0 keynote is partially written in the <a href="http://www.lua.org/">Lua programming language</a>. Oops.</p>
<p>It&#8217;s not surprising though (if true), because many popular games use a non-C scripting language for their game&#8217;s logic. It&#8217;s a versatile and common practice that gives developers (and even users) flexibility and creative freedom.</p>
<p>Whether Apple will remove these games I don&#8217;t know (I doubt it really). If they don&#8217;t, it&#8217;s hypocrisy because the wording of Section 3.3.1 clearly forbids it, and if they do then a bunch of great apps get pulled, a bunch of great developers get screwed, and a bunch of users are left disappointed. Even if they don&#8217;t pull these apps, Section 3.3.1, in its current state, is likely to deter future developers from taking advantage of these powerful techniques.</p>
<p><center><img src="http://www.taoeffect.com/blog/wp-content/uploads/2010/04/firefox-logo.png" alt="" title="" width="500" height="191" class="alignnone size-full wp-image-2045" /></center></p>
<h4>On Firefox</h4>
<p>Many commenters seemed to be confused as to why I brought up <a href="http://getfirefox.com/">Firefox</a>. That discussion was tangential to the issues with Section 3.3.1. Steve referred to the &#8220;intermediate layers&#8221; that have existed on the Mac, suggesting that they all ultimately lead to sub-standard applications:</p>
<blockquote style="background-color:white"><p style="color:black">We&#8217;ve been there before, and intermediate layers between the platform and the developer ultimately produces sub-standard apps and hinders the progress of the platform.</p>
</blockquote>
<p>Though there is truth to that I feel it is only half the story.</p>
<p>The question isn&#8217;t whether you agree or disagree about the quality of cross-platform applications, but whether they should be allowed to exist on a platform at all (please don&#8217;t forget we&#8217;re still talking about the Mac, not the iPhone, where most, if not all, 3rd party toolkits produce native-looking applications).</p>
<p>As far as the Mac is concerned, I&#8217;m grateful for the existence of high quality cross-platform software such as Firefox. A lot of people were puzzled at why I chose Firefox as an example of high-quality cross-platform software, the reason is simple: it fulfills my needs for web browsing better than every other web browser.</p>
<p>Only because so many people brought it up, here&#8217;s a brief list of features that explains why I feel this way, and please note that I consider the availability and quality of plugins/add-ons as part of the browser&#8217;s whole:</p>
<ul>
<li>The Firefox <a href="http://blog.mozilla.com/blog/2008/04/21/a-little-something-awesome-about-firefox-3/">AwesomeBar</a> is awesome. It&#8217;s like Spotlight for your web browser.</li>
<li>Firefox&#8217;s bookmarks allow both tags and descriptions, which I make heavy usage of.</li>
<li>I love Firefox&#8217;s find-as-you-type feature.</li>
<li>I can drag my Firefox data folder to any machine on just about any operating system and everything will just work there.</li>
<li>I&#8217;ve noticed that Firefox uses far less RAM than Safari on my MacBook Pro. Where Safari will use upwards of 1.5GB of RAM, Firefox will use only about 800MB for the same &#8220;level of browsing,&#8221; and it&#8217;s far better about clearing that out when you close windows. To those who claim the opposite to be true, I suggest you delete your Firefox application support folder and reinstall the latest version.</li>
<li>Firefox&#8217;s diverse and remarkably powerful addons are my #1 reason for using it. Many of the addons that I use have no equivalent on other browsers, and this simply seals the deal for me. Some of my personal favorites, in no particular order, include: <a href="https://addons.mozilla.org/en-US/firefox/addon/1122">Tab Mix Plus</a>, <a href="https://addons.mozilla.org/en-US/firefox/addon/648">ProxyButton</a>, <a href="https://addons.mozilla.org/en-US/firefox/addon/2324">Session Manager</a>, <a href="https://addons.mozilla.org/en-US/firefox/addon/403">URL Link</a>, <a href="https://addons.mozilla.org/en-US/firefox/addon/7675">WikiLook</a>, <a href="https://addons.mozilla.org/en-US/firefox/addon/1865">Adblock Plus</a>, <a href="https://addons.mozilla.org/en-US/firefox/addon/3145">BlockSite</a>, <a href="https://addons.mozilla.org/en-US/firefox/addon/3006">DownloadHelper</a>, <a href="https://addons.mozilla.org/en-US/firefox/addon/1843">Firebug</a>, and <a href="https://addons.mozilla.org/en-US/firefox/addon/748">Greasemonkey</a>.</li>
</ul>
<p>Why does Firefox have so many awesome add-ons while Safari and other browsers do not? Oh, that&#8217;s right, it&#8217;s because Firefox runs on just about every operating system, and the addons are cross-platform as well. Firefox&#8217;s users thereby reap the benefits that an open platform and an army of developers provides.</p>
<p>Sure, <strike>Firefox doesn&#8217;t integrate with OS X&#8217;s Services</strike> and other Cocoa-only things, but for me it more than makes up for those relatively benign flaws, and I&#8217;m grateful to have it prominently displayed in my Dock.</p>
<p><b>EDIT:</b> <i>It appears the latest versions of Firefox do integrate with OS X&#8217;s Services. Some minor Cocoa functionality still appears to be missing (like the Dictionary lookup shortcut, though there are <a href="https://addons.mozilla.org/en-US/firefox/addon/7261">add-ons</a> <a href="https://addons.mozilla.org/en-US/firefox/addon/7675">for that</a>), but this is certainly a pleasant surprise. I could only find <a href="http://boomswaggerboom.wordpress.com/2008/06/10/firefox-3-for-mac-os-x-under-the-hood/">this two year old article</a> referencing the changes.</i></p>
<h4>Conclusion</h4>
<p>Don&#8217;t let the digression on Firefox fool you into thinking that I&#8217;m demanding Apple allow <a href="https://developer.mozilla.org/en/XUL">XUL apps</a> like Firefox on the iPhone. That&#8217;s not what Section 3.3.1 is about.</p>
<p>Section 3.3.1 bans applications that look and behave like all the other &#8220;native&#8221; apps on the iPhone, but are &#8220;originally written&#8221; in languages other than C/C++/Objective-C. Details <a href="/blog/2010/04/dear-apple-the-iphone-deserves-a-better-sdk/">here</a> and <a href="/blog/2010/04/steve-jobs-response-on-section-3-3-1/">here</a>, and there&#8217;s also <a href="http://37signals.com/svn/posts/2273-five-rational-arguments-against-apples-331-policy" target="_blank">this excellent 37signals post</a>.</p>
<p><b>Update (4/12/10): <a href="/blog/2010/04/existing-iphone-apps-breaking-the-tos/">Existing iPhone Apps Breaking the TOS</a></b></p>
<p><b>Update (9/10/10): <a href="http://money.cnn.com/2010/09/09/technology/apple_developer_guidelines/index.htm">Eventually, Apple updated and relaxed their terms.</a></b></p>
]]></content:encoded>
			<wfw:commentRss>http://www.taoeffect.com/blog/2010/04/steve-jobs-response-a-brief-followup/feed/</wfw:commentRss>
		<slash:comments>27</slash:comments>
		</item>
		<item>
		<title>Steve Jobs&#8217; response on Section 3.3.1</title>
		<link>http://www.taoeffect.com/blog/2010/04/steve-jobs-response-on-section-3-3-1/</link>
		<comments>http://www.taoeffect.com/blog/2010/04/steve-jobs-response-on-section-3-3-1/#comments</comments>
		<pubDate>Sat, 10 Apr 2010 21:58:58 +0000</pubDate>
		<dc:creator>Greg Slepak</dc:creator>
				<category><![CDATA[Thoughts]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[FuckingAppStore]]></category>
		<category><![CDATA[greg]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Steve Jobs]]></category>

		<guid isPermaLink="false">http://www.taoeffect.com/blog/?p=1964</guid>
		<description><![CDATA[After posting my reaction to clause 3.3.1 of the iPhone SDK terms I decided to write Steve Jobs the following email: Hi Steve, Lots of people are pissed off at Apple&#8217;s mandate that applications be &#8220;originally written&#8221; in C/C++/Objective-C. If you go, for example, to the Hacker News homepage right now: &#60;http://news.ycombinator.com/&#62; You&#8217;ll see that [...]]]></description>
			<content:encoded><![CDATA[<p>After posting <a href="/blog/2010/04/dear-apple-the-iphone-deserves-a-better-sdk/">my reaction to clause 3.3.1 of the iPhone SDK terms</a> I decided to write Steve Jobs the following email:</p>
<blockquote><p>Hi Steve,</p>
<p>Lots of people are pissed off at Apple&#8217;s mandate that applications be &#8220;originally written&#8221; in C/C++/Objective-C. If you go, for example, to the Hacker News homepage right now:</p>
<p>	&lt;http://news.ycombinator.com/&gt;</p>
<p>You&#8217;ll see that most of the front page stories about this new restriction, with #1 being: <a href="http://whydoeseverythingsuck.com/2010/04/steve-jobs-has-just-gone-mad.html">&#8220;Steve Jobs Has Just Gone Mad&#8221;</a> with (currently) 243 upvotes. The top 5 stories are all negative reactions to the TOS, and there are several others below them as well. Not a single positive reaction, even from John Gruber, your biggest fan.</p>
<p>I love your product, but your SDK TOS are growing on it like an invisible cancer.</p>
<p>Sincerely,<br />
Greg</p></blockquote>
<p>His response:</p>
<blockquote style="background-color:white"><p style="color:black">We think John Gruber&#8217;s post is very insightful and not negative:</p>
<p><a style="color:darkblue" href="http://daringfireball.net/2010/04/why_apple_changed_section_331">http://daringfireball.net/2010/04/why_apple_changed_section_331</a></p>
<p style="color:black">Steve</p>
</blockquote>
<p>Of course he was right, I had somehow missed that post by Gruber, having only read <a href="http://daringfireball.net/2010/04/iphone_agreement_bans_flash_compiler">the original</a>. Gruber&#8217;s <a href="http://daringfireball.net/2010/04/why_apple_changed_section_331">second post</a>, which Jobs appears to be endorsing here, is indeed, very insightful, and may explain Apple&#8217;s motivations for the updates to section 3.3.1.</p>
<p>That said, I did not, and still don&#8217;t, consider those reasons to be very good, so I sent a reply in kind:</p>
<blockquote><p>Sorry. I didn&#8217;t catch that post, but I finished it just now.</p>
<p>I still think it undermines Apple. You didn&#8217;t need this clause to get to where you are now with the iPhone&#8217;s market share, adding it just makes people lose respect for you and run for the hills, as a commenter to that article stated:</p>
<div style="border-left: 1px solid white; padding-left: 10px">
<p style="font-style:normal">&#8220;So what Apple does not want is for some other company to establish a de facto standard software platform on top of Cocoa Touch. Not Adobe’s Flash. Not .NET (through MonoTouch). If that were to happen, there’s no lock-in advantage.&#8221;</p>
<p>And that makes Apple evil. At least, it does in the sense that Google uses the term in &#8220;don&#8217;t be evil&#8221; &#8211; I believe pg translated &#8220;evil&#8221; as something along the lines of &#8220;trying to compete by means other than making the best product and marketing it honestly&#8221;.</p></div>
<p>From a developer&#8217;s point of view, you&#8217;re limiting creativity itself. Gruber is wrong, there are plenty of [applications] written using cross-platform frameworks that are amazing, that he himself has praised. Mozilla&#8217;s Firefox just being one of them.</p>
<p>I don&#8217;t think Apple has much to gain with 3.3.1, quite the opposite actually.</p>
<p>Sincerely,<br />
Greg</p></blockquote>
<p>Within about 3 minutes a second reply graced my inbox:</p>
<blockquote style="background-color:white"><p style="color:black">We&#8217;ve been there before, and intermediate layers between the platform and the developer ultimately produces sub-standard apps and hinders the progress of the platform.</p>
</blockquote>
<p>With replies this short (understandably, of course) I can only guess at his meaning. Perhaps he&#8217;s referring to the days when some applications were being written with CodeWarrior and various other build systems. Or maybe he&#8217;s referring to the transition from Carbon-based applications to fully Cocoa applications (like Apple&#8217;s own Finder), or applications that were written using Macromedia&#8217;s Shockwave, or applications written in pure Java or those written in the now-defunct Java-Cocoa bridge. Perhaps it&#8217;s a bit of all of these.</p>
<p>Sure, many of the apps written using these systems aren&#8217;t very pretty, but can you imagine a Mac without Mozilla&#8217;s Firefox? Or a Mac that couldn&#8217;t run applications written in Python, Ruby, Java or a myriad of other languages? You would probably consider such a Mac severly handicapped. I don&#8217;t believe the existence of these in any way hampers Apple&#8217;s ability to progress the Mac platform, to the contrary, they enhance it. The existence of some sub-standard applications should not remove our ability to use those works of art that just so happen to be written without the aid of Apple&#8217;s tools.</p>
<p>I have nothing against Apple&#8217;s desire to enforce &#8220;quality applications&#8221;, but there are far better ways of going about it. Mandating that applications be &#8220;originally written&#8221; using Xcode and the C-based languages is just foolish as it does not magically create quality. What it does do, <a href="/blog/2010/04/dear-apple-the-iphone-deserves-a-better-sdk/">as I explained previously</a>, is send developers running for the hills, or more specifically, to competing platforms where they have more creative freedom.</p>
<h4>Does Section 3.3.1 help Apple in any way?</h4>
<p>Gruber makes several claims:</p>
<blockquote><p>So what Apple does not want is for some other company to establish a de facto standard software platform on top of Cocoa Touch. Not Adobe’s Flash. Not .NET (through MonoTouch). If that were to happen, there’s no lock-in advantage. If, say, a mobile Flash software platform — which encompassed multiple lower-level platforms, running on iPhone, Android, Windows Phone 7, and BlackBerry — were established, that app market would not give people a reason to prefer the iPhone.</p>
<p>And, obviously, such a meta-platform would be out of Apple’s control. Consider a world where some other company’s cross-platform toolkit proved wildly popular. Then Apple releases major new features to iPhone OS, and that other company’s toolkit is slow to adopt them. At that point, it’s the other company that controls when third-party apps can make use of these features.</p></blockquote>
<p>There is truth to this, but I think it&#8217;s absurd to think that a third-party toolkit that failed to keep up with Apple&#8217;s APIs and produced poor quality apps would ever be popular. Why would users and/or developers willingly choose to use an inferior product? And if they do, so what? No one is forcing you to use them. Further, the vast majority of applications written for the iPhone *have* been written using Apple&#8217;s tools, before these changes were made to Section 3.3.1.</p>
<p>Are these imagined advantages worth the consequences?</p>
<p>Many (if not most) developers do not view a company that is blatantly trying to &#8220;lock them in&#8221; favorably. It is not a virtue that people respect. If I were to write an app for the iPhone, I would choose the tools that I deemed &#8220;the best&#8221;, voluntarily, and that probably means I&#8217;ll use Objective-C and Xcode. But the notion that those are the <i>only</i> tools that I&#8217;m allowed to use scares me, and it seems, many others.</p>
<p>The iPhone is the #1 smartphone because people *like it*. They chose it based on the quality of the product itself, and developers flocked to it because of its popularity and its amazing tools. There was no need to lock anyone in, Apple got to where it is on <b>merit</b>, and that&#8217;s respectable. Trying to forcibly lock users and developers into the platform is a sign of insecurity.</p>
<h4>Everyone fears The Ignorant Boss</h4>
<p>For developers, this is the person who knows nothing about programming yet insists that you use X tool and write it in Y language. Now, suddenly, it is as if the formerly independent iPhone developers all have such a boss, and the worst part is that they can&#8217;t even communicate with this one. He lives several thousand miles away in Cupertino and isn&#8217;t even aware of their existence or anything related to their project.</p>
<p>Gruber goes on to discuss the impact Section 3.3.1 has on the user&#8217;s point of view:</p>
<blockquote><p>I can see two arguments here. On the one side, this rule should be good for quality. Cross-platform software toolkits have never — ever — produced top-notch native apps for Apple platforms.</p></blockquote>
<p>Ignoring the fact that Gruber is making objective that which is totally subjective, this is just plainly untrue.</p>
<p>One of my favorite applications on the Mac is Mozilla&#8217;s Firefox, and certainly my favorite web browser. I think it beats the pants off Safari. As this is not a review of Firefox I won&#8217;t get into the details, but I will point out that Firefox is written using a cross-platform software toolkit.</p>
<p>A friend of mine is a musician who thinks the world of <a href="http://www.ableton.com/">Ableton Live</a> (also written using a cross-platform software toolkit), while deriding Apple&#8217;s Logic Pro as &#8220;lackluster.&#8221;</p>
<p>Without question these are all examples of &#8220;top-notch&#8221; software written using cross-platform toolkits. There are hundreds of others. Much of the software that&#8217;s hidden from view and supports the foundations of Mac OS X itself is software that is written using cross-platform toolkits, and all of these are &#8220;native&#8221; in the sense that they run just as fast as software using the Cocoa frameworks. Some might have widgets that look different, but so do most iPhone games written in accordance to Apple&#8217;s rules, should we ban them because of it? That would be absurd and tantamount to software-racism!</p>
<p>I sent a final response to this effect:</p>
<blockquote><p>The Mac has only been helped by the fact that Firefox, Ableton Live, and hundreds of other high-quality applications can run on it thanks to the fact that developers have a choice as to what tools they can use on it.</p>
<p>Crappy developers will make crappy apps regardless of how many layers there are, and it doesn&#8217;t make sense to limit source-to-source conversion tools like Unity3D and others. They&#8217;re all building apps through the iPhone developer tools in the end so the situation isn&#8217;t even comparable to the Mac where applications can completely avoid using Apple&#8217;s frameworks by replacing them with others.</p>
<p>In my opinion, 3.3.1 only serves to make the platform less attractive to legitimate developers, giving them reason to write their software for competing platforms instead.</p>
<p>Thanks for considering this.</p>
<p>Sincerely,<br />
Greg</p></blockquote>
<p>Apple is free to write whatever absurd rules they want for their SDK, but in doing so, I think the &#8220;creative company&#8221; is undermining creativity itself, and at its own expense.</p>
<p>The full text of this exchange with headers (sans the final reply), is right <a href="/other/DeveloperBacklashSteveJobsEmail.txt.zip">here</a>.</p>
<p><b>Update (4/11/10): <a href="/blog/2010/04/steve-jobs-response-a-brief-followup/">Steve Jobs’ Response: A Brief Followup</a></b></p>
<p><b>Update (9/10/10): <a href="http://money.cnn.com/2010/09/09/technology/apple_developer_guidelines/index.htm">A few months after this posting, Apple updated and relaxed their terms.</a></b></p>
]]></content:encoded>
			<wfw:commentRss>http://www.taoeffect.com/blog/2010/04/steve-jobs-response-on-section-3-3-1/feed/</wfw:commentRss>
		<slash:comments>227</slash:comments>
		</item>
		<item>
		<title>Dear Apple: The iPhone deserves better SDK terms</title>
		<link>http://www.taoeffect.com/blog/2010/04/dear-apple-the-iphone-deserves-a-better-sdk/</link>
		<comments>http://www.taoeffect.com/blog/2010/04/dear-apple-the-iphone-deserves-a-better-sdk/#comments</comments>
		<pubDate>Fri, 09 Apr 2010 17:02:57 +0000</pubDate>
		<dc:creator>Greg Slepak</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Thoughts]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[FuckingAppStore]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[greg]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://www.taoeffect.com/blog/?p=1942</guid>
		<description><![CDATA[Outrage over this little clause in the new iPhone developer SDK terms is erupting all over the internet: 3.3.1 — Applications may only use Documented APIs in the manner prescribed by Apple and must not use or call any private APIs. Applications must be originally written in Objective-C, C, C++, or JavaScript as executed by [...]]]></description>
			<content:encoded><![CDATA[<p>Outrage over this little clause in the new iPhone developer SDK terms is <a href="http://joeberkovitz.com/blog/2010/04/08/apple-takes-stance-on-consciousness/">erupting</a> <a href="http://whydoeseverythingsuck.com/2010/04/steve-jobs-has-just-gone-mad.html">all</a> <a href="http://fulldisclojure.blogspot.com/2010/04/steve-jobs-just-ruined-iphone-for.html">over</a> <a href="http://redth.info/2010/04/09/is-monotouch-now-dead-in-the-water-what-does-apples-new-iphone-developer-agreement-mean/">the</a> <a href="http://blog.joa-ebert.com/2010/04/09/what-apple-just-did/">internet</a>:</p>
<blockquote><p>3.3.1 — Applications may only use Documented APIs in the manner prescribed by Apple and must not use or call any private APIs. Applications must be originally written in Objective-C, C, C++, or JavaScript as executed by the iPhone OS WebKit engine, and only code written in C, C++, and Objective-C may compile and directly link against the Documented APIs (e.g., Applications that link to Documented APIs through an intermediary translation or compatibility layer or tool are prohibited).</p></blockquote>
<p>And rightly so.</p>
<p>On our <a href="/about">About page</a> we explain why we develop <a href="/espionage">software</a> for the Mac:</p>
<blockquote><p style="text-align:center">We believe that Apple has created an <a href="http://www.apple.com/macosx/">environment</a> where great software can really thrive.</p>
</blockquote>
<p>I still feel this way about the Mac, but I no longer consider the iPhone or the iPad worthy of such sentiment because of the draconian terms under which one must operate to develop for those platforms.</p>
<p>What Apple&#8217;s engineers have done with the iPhone is amazing. They&#8217;ve simply outdone themselves when it comes to the quality of both the software and the hardware. However, I no longer think Apple can continue to honestly claim that they have the best phone around. Steve Jobs and Apple&#8217;s legal department have taken a figurative dump on their hard work with these insane restrictions, and that creates an foul odor that stains the product as a whole.</p>
<h4>Missing Applications</h4>
<p>The new rules, interpreted as written, ban all kinds of applications written by great folks who have put in countless hours of work developing for this platform.</p>
<p>Games developed using the great <a href="http://unity3d.com/unity/">Unity3D</a> engine are <i>not</i> &#8220;originally written&#8221; in Objective-C, C, or C++.</p>
<p>The incredible work that <a href="http://jlongster.com/about/">James Long</a> put into creating what is probably the first-ever <a href="http://jlongster.com/blog/2010/04/05/farmageddon-available/">OpenGL game written in Scheme on the App Store</a>, is now thrown <a href="http://jlongster.com/blog/2010/04/09/scheme-dead-iphone/">into question</a>.</p>
<p>With these terms, Apple is going against its own <b>Think Different</b> model, destroying creativity itself through the enforcement of a monoculture of developer tools. They are effectively saying that you can be creative, <i>so long as you&#8217;re creative our way</i>, an absurdity known in psychology as a <a href="http://en.wikipedia.org/wiki/Double_bind">double bind</a>.</p>
<h4>Developers Running Away</h4>
<p>The SDK terms are not just insulting, they&#8217;re bad business. Great developers like Tim Bray <a href="http://techcrunch.com/2010/03/15/tim-bray-android-google-iphone/">are forsaking the iPhone platform out of disgust</a> and running to Google&#8217;s Android platform. Dan Grigsby of Mobile Orchard <a href="http://www.mobileorchard.com/goodbye/">just announced</a> they&#8217;re abandoning iPhone development because of these restrictions.</p>
<p>Despite my familiarity with Apple&#8217;s tools and the language Apple insists developers use, at the present time I can&#8217;t envision myself writing an app for the App Store, because in clicking that Agree button on the license terms I suddenly find myself feeling like an infant, as though I can no longer be trusted to make basic decisions and must therefore be locked in a crib surrounded by child-proof toys and bars.</p>
<p>For companies like Google, all of this should be good news, because despite its shortcomings, Android&#8217;s relatively open platform is starting to look far more inviting.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.taoeffect.com/blog/2010/04/dear-apple-the-iphone-deserves-a-better-sdk/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Find me on Posterous</title>
		<link>http://www.taoeffect.com/blog/2010/03/find-me-on-posterous/</link>
		<comments>http://www.taoeffect.com/blog/2010/03/find-me-on-posterous/#comments</comments>
		<pubDate>Wed, 10 Mar 2010 21:04:54 +0000</pubDate>
		<dc:creator>Greg Slepak</dc:creator>
				<category><![CDATA[Thoughts]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[greg]]></category>
		<category><![CDATA[politics]]></category>

		<guid isPermaLink="false">http://www.taoeffect.com/blog/?p=1929</guid>
		<description><![CDATA[As this is a company blog it might not be the best of places for me to post some of my more politically-charged-unrelated-to-Tao-Effect-thoughts. Therefore I&#8217;ve started a Posterous account to which I&#8217;ll be posting that sort of goodness.]]></description>
			<content:encoded><![CDATA[<p>As this is a company blog it might not be the best of places for me to post some of my more <a href="/blog/2009/03/dark-day-for-freedom/">politically-charged-unrelated-to-Tao-Effect-thoughts</a>.</p>
<p>Therefore I&#8217;ve started a <a href="http://gregslepak.posterous.com/">Posterous account</a> to which I&#8217;ll be posting <a href="http://gregslepak.posterous.com/dont-mess-with-kucinich">that sort of goodness</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.taoeffect.com/blog/2010/03/find-me-on-posterous/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Most Important Film of the Decade Goes To&#8230;</title>
		<link>http://www.taoeffect.com/blog/2010/03/best-documentary-of-the-decade-goes-to/</link>
		<comments>http://www.taoeffect.com/blog/2010/03/best-documentary-of-the-decade-goes-to/#comments</comments>
		<pubDate>Mon, 08 Mar 2010 07:42:47 +0000</pubDate>
		<dc:creator>Greg Slepak</dc:creator>
				<category><![CDATA[Thoughts]]></category>
		<category><![CDATA[documentary]]></category>
		<category><![CDATA[film]]></category>
		<category><![CDATA[greg]]></category>
		<category><![CDATA[review]]></category>

		<guid isPermaLink="false">http://www.taoeffect.com/blog/?p=1920</guid>
		<description><![CDATA[What this film does in 104 minutes is simply magical. The Union: The Business Behind Getting High And you can watch it, right now, for free on Google Video.]]></description>
			<content:encoded><![CDATA[<p>What this film does in 104 minutes is simply magical.</p>
<p><b>The Union: The Business Behind Getting High</b></p>
<p><i>And you can watch it, right now, <a href="http://video.google.com/videoplay?docid=-9077214414651731007">for free on Google Video</a>.</i></p>
]]></content:encoded>
			<wfw:commentRss>http://www.taoeffect.com/blog/2010/03/best-documentary-of-the-decade-goes-to/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How Secure Is Your iPad?</title>
		<link>http://www.taoeffect.com/blog/2010/01/how-secure-is-your-ipad/</link>
		<comments>http://www.taoeffect.com/blog/2010/01/how-secure-is-your-ipad/#comments</comments>
		<pubDate>Thu, 28 Jan 2010 18:11:18 +0000</pubDate>
		<dc:creator>Greg Slepak</dc:creator>
				<category><![CDATA[Thoughts]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[greg]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">http://www.taoeffect.com/blog/?p=1736</guid>
		<description><![CDATA[Apple&#8217;s iPad may turn out to be more of a security risk than a useful tool for some, especially for those who, prior to yesterday&#8217;s launch, speculated that the iPad would be a God-send to the health care system, and possibly other sectors like businesses. According to Steve, however, the iPad is designed primarily for [...]]]></description>
			<content:encoded><![CDATA[<p>Apple&#8217;s iPad may turn out to be more of a security risk than a useful tool for some, especially for those who, prior to yesterday&#8217;s launch, <a href="http://www.readwriteweb.com/archives/the_healthcare_system_an_apple_tablets_biggest_opp.php">speculated</a> that the iPad <a href="http://www.medpagetoday.com/Blogs/18143">would be a God-send</a> to the health care system, and possibly other sectors like businesses.</p>
<p>According to Steve, however, the iPad is designed primarily for the following activities:</p>
<p><center>
<div class="img" style="margin-bottom:0px"><img src="http://www.taoeffect.com/blog/wp-content/uploads/2010/01/iPad_specialties1.png" alt="" title="" width="500" height="243" class="alignnone size-full wp-image-1739" /></div>
<p></center></p>
<p>For some, even that may be something of a stretch.</p>
<p>As <a href="http://www.aaronsw.com/weblog/ipad">many</a> <a href="http://lifehacker.com/5458690/the-problem-with-the-apple-ipad">have</a> <a href="http://i.gizmodo.com/5458382/8-things-that-suck-about-the-ipad">pointed out</a>, the iPad is more of an oversized iPod Touch than an undersized MacBook Air, or as Daniel Tenner so aptly put it: <a href="http://danieltenner.com/posts/0015-ipad-an-apple-for-mom.html">&#8220;The uncomputer for the masses&#8221;</a>.</p>
<p>When you send someone an email, you expect it to fall into the hands of its intended recipient, not someone who happened to get a hold of their device. I would never download all of my email onto an iPad because I can neither <a href="/espionage">encrypt nor password protected it</a>. Apple&#8217;s lockdown of the OS means third-party developers cannot intervene and remedy this situation because they&#8217;re not allowed to touch certain parts of the system.</p>
<p>Businesses and hospitals won&#8217;t be thrilled with employees and nurses running around with an easily swipeable device containing unprotected company secrets, client data, and patient information. Thanks to the &#8220;duplicating functionality&#8221; clause of the SDK TOS, developers can&#8217;t even write their own encrypted versions of Mail or the iWork suite.</p>
<p>If you want a secure iPad, you&#8217;ll either have to hope Apple implements it, or depend on each individual developer to properly secure their application&#8217;s data&mdash;a situation that nobody should be thrilled with.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.taoeffect.com/blog/2010/01/how-secure-is-your-ipad/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Michael Moore&#8217;s &#8220;Capitalism: A Love Story&#8221;</title>
		<link>http://www.taoeffect.com/blog/2009/11/michael-moores-capitalism-a-love-story/</link>
		<comments>http://www.taoeffect.com/blog/2009/11/michael-moores-capitalism-a-love-story/#comments</comments>
		<pubDate>Sun, 01 Nov 2009 19:36:14 +0000</pubDate>
		<dc:creator>Greg Slepak</dc:creator>
				<category><![CDATA[Thoughts]]></category>
		<category><![CDATA[capitalism]]></category>
		<category><![CDATA[government]]></category>
		<category><![CDATA[greg]]></category>
		<category><![CDATA[michael moore]]></category>
		<category><![CDATA[society]]></category>

		<guid isPermaLink="false">http://www.taoeffect.com/blog/?p=988</guid>
		<description><![CDATA[Warning: This blog post is an opinion piece by Greg Slepak (while he searches for an appropriate medium), and has nothing to do with Tao Effect news. This weekend I saw Michael Moore&#8217;s latest film Capitalism: A Love Story. Like most of his films, this one should come with a disclaimer: for the duration of [...]]]></description>
			<content:encoded><![CDATA[<p><i>Warning: This blog post is an opinion piece by Greg Slepak (while he searches for an appropriate medium), and has nothing to do with Tao Effect news.</i></p>
<p>This weekend I saw Michael Moore&#8217;s latest film <b>Capitalism: A Love Story</b>. Like most of his films, this one should come with a disclaimer: for the duration of the film you&#8217;ll be looking at the world through the eyes of Michael Moore and those who reflect his views. Don&#8217;t expect to see or hear any conflicting views or arguments.</p>
<p>For those that hate Moore&#8217;s films, there&#8217;s plenty in the film to nit-pick about. There&#8217;s a scene where he does his best to convince you that all Christian priests hate Capitalism and consider it an evil. Some have argued that he&#8217;s misusing the word &#8220;capitalism&#8221; altogether and should instead say &#8220;corporatism&#8221;. He also tends to group various corporate entities into a single-group. AIG, Citibank, Goldman Sachs, Bank of America, etc. All of these are placed in the group of &#8220;evil rich people bent on screwing over the lower-classes while having cocktail parties on corporate yachts.&#8221; In some cases, there is actual truth to that notion, but of course for those looking to put down Michael and nit-pick, he leaves plenty of room in his films to accommodate you.</p>
<p>However, despite the flaws, I enjoy watching Moore&#8217;s films precisely because of how rare their kind is.</p>
<p>It has been my general experience in life that many of the people that I encounter are perfectly satisfied to watch the latest action blockbuster out of hollywood, and when a movie like <i style="color:inherit">Capitalism</i> rolls out they do two things: they pass up the ticket to see it for another action blockbuster, and then proceed to lambaste his films with a level of ignorance that far exceeds anything that I&#8217;ve heard Michael Moore say.</p>
<p>What further amazes me is how successful Moore has been at getting his films to play at major theaters. There are many many other films out there that do a much better job of espousing upon the insanities of our society and yet hardly ever make it into major theaters. Documentaries like <a href="http://en.wikipedia.org/wiki/Food,_Inc.">Food Inc.</a>, <a href="http://en.wikipedia.org/wiki/Jesus_Camp">Jesus Camp</a>, <a href="http://en.wikipedia.org/wiki/The_Century_of_the_Self">The Century of Self</a> (<a href="http://video.google.com/videoplay?docid=8953172273825999151">video link</a>), <a href="http://en.wikipedia.org/wiki/Who_Killed_the_Electric_Car%3F">Who Killed the Electric Car</a>, and many others only find home to a handful of theaters across the country. These important films have been kicked out of mainstream society, to be replaced by the latest blow-em-up out of Hollywood that has sold out several times over.</p>
<p>That scenario never ceases to amaze me. How such a large amount of people, often the group that stands to benefit most from seeing movies like <i style="color:inherit">The Century of Self</i>, who often live quite miserable lives because of their complete ignorance of their surroundings, can constantly, repeatedly purchase tickets to the same exact action script that Hollywood modifies slightly on a bi-monthly basis.</p>
<p>Ironically, it may in fact be <i style="color:inherit">because</i> of the overly narrow viewpoint espoused in <i style="color:inherit">Capitalism</i>, and its heavy use of emotional content, that he is able to get it distributed so widely. I say that&#8217;s better than nothing.</p>
<p>Further, while there are many imperfections in his films, they nevertheless tend to bring up worthy causes and viewpoints into the mainstream for discussion.</p>
<p>I also have to credit <i style="color:inherit">Capitalism</i> for making me consider a thought that I hadn&#8217;t thought of before, namely,</p>
<p><b>Why do we allow corporate lobbyists and advisers at all?</b></p>
<p>It seems to me that just as we supposedly have the separation of church and state, we should institute the separation of the state from all other entities other than, of course, &#8220;the people.&#8221;</p>
<p>One thing that I&#8217;ve been astonished to learn from some of these films (Moore&#8217;s and others), is how incredibly entrenched major corporations are in the decision making of our government.</p>
<p>I considered the opposing viewpoint, that perhaps &#8220;because they represent the interests of a large amount of people and jobs&#8221; they should therefore have a strong say in policy making.</p>
<p>However, this is simply not true. Corporate interests do not include various idealized notions such as the right to a trial by jury, and even more idealized, yet worthy, concepts such as the rights to &#8220;life, liberty, and the pursuit of happiness.&#8221; Corporate interests are much simpler than that, they just want to &#8220;make a lot of money.&#8221;</p>
<p>Worse, they have demonstrated unequivocally that the way they&#8217;ll go about getting this money will often be by <i style="color:inherit">screwing over</i> their workers, and quite often, their customers as well.</p>
<p>So, it seems to me that such entities should have no place whatsoever in any policy making that affects the lives of people outside of their corporation (and in some cases even inside of their corporation). Their advice is usually, simply put: <b>bad</b>. And in the rare instances where it&#8217;s not, we certainly did not need them for it. Instead of dictating policy to our representatives, they can call in like the rest of us. Respected scientists, nutritionists, farmers and various other in-field experts make good advisers to the FDA and USDA, not the board members of Kellogg&#8217;s and Monsanto.</p>
<p>Government, people often forget, should be owned by <b>the people</b> to serve the interests of <b>the people</b>. When corporations get in the picture, the people are no longer represented, instead the interests of a very small minority is represented, usually at the expense of all the others.</p>
<p>This is what has happened to our government. Although this situation is not anything new, it&#8217;s nevertheless messed up and it&#8217;s certainly worth changing.</p>
<p>A good way to upset the status quo is simply through the spread of information and the systematic removal of ignorance. Michael Moore&#8217;s <i style="color:inherit">Capitalism: A Love Story</i>, though certainly flawed, helps to serve this purpose by bringing some of these issues to the forefront of America&#8217;s consciousness, and for that reason, I recommend you see it.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.taoeffect.com/blog/2009/11/michael-moores-capitalism-a-love-story/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Refills: A Sustainable Solution</title>
		<link>http://www.taoeffect.com/blog/2009/04/refills-a-sustainable-solution/</link>
		<comments>http://www.taoeffect.com/blog/2009/04/refills-a-sustainable-solution/#comments</comments>
		<pubDate>Thu, 16 Apr 2009 17:16:39 +0000</pubDate>
		<dc:creator>Greg Slepak</dc:creator>
				<category><![CDATA[Thoughts]]></category>
		<category><![CDATA[conservation]]></category>
		<category><![CDATA[greg]]></category>
		<category><![CDATA[RBPs]]></category>
		<category><![CDATA[recycling]]></category>
		<category><![CDATA[sustainability]]></category>

		<guid isPermaLink="false">http://www.taoeffect.com/blog/?p=468</guid>
		<description><![CDATA[What if you could get refills for all of the products that you buy that come in containers? We&#8217;ve become accustomed to the notion that every product must come in its own packaging, that this is &#8220;obvious&#8221; and that it&#8217;s the only way things can be done. Every day I use a variety of container-based [...]]]></description>
			<content:encoded><![CDATA[<p>What if you could get refills for all of the products that you buy that come in containers?</p>
<p>We&#8217;ve become accustomed to the notion that every product must come in its own packaging, that this is &#8220;obvious&#8221; and that it&#8217;s the only way things can be done.</p>
<p>Every day I use a variety of <b>container-based products</b> (CBPs for short): shampoo, face-wash, toothpaste, liquid soap, orange juice, etc. etc. The list of CBPs goes on.  This causes a huge strain on the environment. Companies use giant factories across the world to manufacture hundreds of thousands, and in some cases millions of CBPs.  For each CBP resources and energy are used to create the container, then all of these little containers are shipped all over the world in an inefficient manner.</p>
<p>Wouldn&#8217;t it be great if we could get rid of most of them? I think such a world is possible.</p>
<p>This brings up several questions: Could this cause difficulties for brands to compete? After all, you recognize that this particular brand of sugar-water belongs to Pepsi because it comes in a CBP that has the Pepsi logo on it. And how are you to know what&#8217;s in your shampoo if it doesn&#8217;t have a container to list the ingredients?</p>
<p>Imagine the following:</p>
<h4>A Different World</h4>
<p>A consumer walks into a local grocery store in search of body wash. He grabs a sleek bottle of  Product 5eX promising to make him more attractive to the opposite sex. Except, this isn&#8217;t a CBP, in fact, while the store&#8217;s isles are packed with various bottled products much as they are today, there&#8217;s not a single CBP to be found, what our gullible protagonist holds in his hands is actually an RBP&mdash;a <b>refill-based-product</b>.</p>
<p>After weeks of usage and several unsuccessful attempts at attracting a mate, our friend runs out of Product 5eX and decides that perhaps he hasn&#8217;t used it long enough and so drives back to the grocery store in search of more.  However, instead of going back to the isle where he originally found it, he places the empty container, along with empty containers of toothpaste, face-wash, and 9-liter bottle of cola on a conveyor belt at the front of the store while swiping his credit card.  After shopping around for various food products inside he&#8217;s ready to checkout, and so are his RBPs.</p>
<p>In such a world there are many possibilities. Perhaps you could use a generic container and simply use the product&#8217;s unique ID number to refill it. There could be a huge online database that matches product IDs with detailed information about each product such as nutrition facts, ingredients, etc. All with the latest information on each ingredient and links to further information.</p>
<h4>Not So Different</h4>
<p>In fact the concept of an RBP is not so foreign.  Recently my local OfficeMax began offering refills for all ink cartridges.  Refills have existed at restaurants as long as I&#8217;ve known.</p>
<p>While many of today&#8217;s containers are recyclable, recycling is not nearly as good as reusing and reducing.  Recycling takes energy, and many of the things that you put into your recycling bin don&#8217;t actually get recycled for one reason or another.  It does not really tackle the core issue.</p>
<p>Instead of creating and shipping millions of little bottles, companies could send entire vats of refillable goop all over the world. The RBP model is not just a giant win for the planet, it&#8217;s a boon for consumers and producers alike, as it would drive down the cost of production and therefore the cost of products.</p>
<h4>Challenges</h4>
<p>There are certainly many questions that need to be addressed for such a world to become a reality. For example, the question of sanitation. How can you guarantee that a refilled product will be as fresh as a brand new one if the container has been opened? I&#8217;m sure that through various techniques and technologies such challenges can be overcome. Perhaps each major reseller can have its own mini-sanitizing doo-hickey that cleans the insides of containers. Like all engineering problems, the solutions are out there as long as someone is willing to put in the effort.</p>
<p>Think it&#8217;s a good idea? Pass it on. <img src='http://www.taoeffect.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.taoeffect.com/blog/2009/04/refills-a-sustainable-solution/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

