<?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>Shaun Smith &#187; Robotlegs</title>
	<atom:link href="http://shaun.boyblack.co.za/blog/category/robotlegs/feed/" rel="self" type="application/rss+xml" />
	<link>http://shaun.boyblack.co.za/blog</link>
	<description>Flex, Ruby, Mongo - London, UK</description>
	<lastBuildDate>Sat, 04 Feb 2012 17:39:55 +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>Readme</title>
		<link>http://shaun.boyblack.co.za/blog/2012/02/04/readme/</link>
		<comments>http://shaun.boyblack.co.za/blog/2012/02/04/readme/#comments</comments>
		<pubDate>Sat, 04 Feb 2012 17:04:25 +0000</pubDate>
		<dc:creator>shaun</dc:creator>
				<category><![CDATA[Banter]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Resources]]></category>
		<category><![CDATA[Robotlegs]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[readme]]></category>

		<guid isPermaLink="false">http://shaun.boyblack.co.za/blog/?p=1069</guid>
		<description><![CDATA[Have I mentioned that I love GitHub? When you put a readme file into a folder that file is formatted and presented nicely through GitHub&#8217;s file browser. For example: https://github.com/visionmedia/uikit Scrolling down a little we can see a nicely formatted readme file. GitHub strongly recommends adding a readme file to the root of your repository, but what I didn&#8217;t realise until recently was that it works for any folder in your repo. GitHub already has the best online file browser &#8230; <a href="http://shaun.boyblack.co.za/blog/2012/02/04/readme/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Have I mentioned that I love <a href="https://github.com/">GitHub</a>?</p>
<p>When you put a readme file into a folder that file is formatted and presented nicely through GitHub&#8217;s file browser. For example:</p>
<p><a href="https://github.com/visionmedia/uikit">https://github.com/visionmedia/uikit</a></p>
<p>Scrolling down a little we can see a nicely formatted readme file.<span id="more-1069"></span></p>
<p>GitHub strongly recommends adding a readme file to the root of your repository, but what I didn&#8217;t realise until recently was that it works for any folder in your repo. GitHub already has the best online file browser out there, but this specific feature can turn your source tree into your documentation.</p>
<p>For <a href="https://github.com/robotlegs/robotlegs-framework">Robotlegs 2</a> I decided to try it out:</p>
<p><a href="https://github.com/darscan/robotlegs-framework/tree/version2/src/robotlegs/bender/core/async">Async</a><br />
<a href="https://github.com/darscan/robotlegs-framework/tree/version2/src/robotlegs/bender/core/messaging">MessageDispatcher</a><br />
<a href="https://github.com/darscan/robotlegs-framework/tree/version2/src/robotlegs/bender/extensions">Extensions</a></p>
<p>Almost every package in the entire repo has a readme file. The best way to learn about Robotlegs 2 is to browse the <a href="https://github.com/robotlegs/robotlegs-framework">source and readme files</a> on GitHub.</p>
<p><img class="alignnone size-full wp-image-1075" title="github-logo" src="http://shaun.boyblack.co.za/blog/wp-content/uploads/2012/02/github-logo.png" alt="" width="512" height="512" /></p>
]]></content:encoded>
			<wfw:commentRss>http://shaun.boyblack.co.za/blog/2012/02/04/readme/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RL Reloaded</title>
		<link>http://shaun.boyblack.co.za/blog/2012/01/23/rl-reloaded/</link>
		<comments>http://shaun.boyblack.co.za/blog/2012/01/23/rl-reloaded/#comments</comments>
		<pubDate>Mon, 23 Jan 2012 12:03:13 +0000</pubDate>
		<dc:creator>shaun</dc:creator>
				<category><![CDATA[Banter]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Robotlegs]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[framework]]></category>

		<guid isPermaLink="false">http://shaun.boyblack.co.za/blog/?p=1023</guid>
		<description><![CDATA[I&#8217;ve been worried for quite a long time. Robotlegs 1 is small and simple but a little difficult to extend. I want Robotlegs 2 to be flexible without becoming overly large or complex. Timing To extend any framework you need to be able to hook into that framework&#8217;s initialization process. That Damned Context The Robotlegs 1 context class was, to be frank, rubbish &#8211; it set defaults, configured dependencies and controlled initialization. Worse, to hook into the initialization process or &#8230; <a href="http://shaun.boyblack.co.za/blog/2012/01/23/rl-reloaded/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been worried for quite a long time. <a href="http://www.robotlegs.org/">Robotlegs 1</a> is small and simple but a little difficult to extend. I want <a href="https://github.com/robotlegs/robotlegs-framework">Robotlegs 2</a> to be flexible without becoming overly large or complex.</p>
<h2>Timing</h2>
<p>To extend any framework you need to be able to hook into that framework&#8217;s initialization process.</p>
<h2>That Damned Context</h2>
<p>The Robotlegs 1 context class was, to be frank, rubbish &#8211; it set defaults, configured dependencies and controlled initialization. Worse, to hook into the initialization process or change the defaults, users had to extend the class itself resulting in the proliferation of funny looking words like SignalDrivenCovariantlyMediatedModularShellContext.<span id="more-1023"></span></p>
<h2>How Could You Let That Happen?</h2>
<p>Extending the context was a silly idea &#8211; and I knew it at the time. It made me sad, deep down inside, but I knew that if I waited for a better solution to emerge the framework might never ship.</p>
<p>Also, my goals for Robotlegs 1 were:</p>
<p>1. Make it small<br />
2. Make it fast<br />
3. Release it</p>
<p>A ton of compromises were made to keep the number of classes down to an absolute minimum. That&#8217;s not how I usually write code. Besides&#8230;</p>
<h2>Small Only Goes So Far</h2>
<p>I always start by doing the simplest thing possible &#8211; it&#8217;s a good way to feel out a problem space. &#8220;<strong>What</strong> am I trying to do?&#8221;. The &#8220;<strong>how</strong>&#8221; doesn&#8217;t matter yet, but becomes important much later when I ask &#8220;How would I <strong>like</strong> to do this?&#8221;.</p>
<p>When writing actual code, however, I&#8217;m constantly faced with this annoying question: &#8220;Should I break this out?&#8221;. When doing the simplest thing possible I often decide against extraction: I&#8217;ve got a specific task to complete (like getting a test to pass) and I can refactor later if the idea proves itself to be worthwhile. Also, I know that extraction inevitably leads to a new set of design decisions. And I&#8217;ll have to start with a test &#8211; for something whose purpose I am only just discovering. And it ups the class count.</p>
<p>Keeping class count down for it&#8217;s own sake is almost always a bad idea. However, I don&#8217;t think Robotlegs 1 would have experienced the same adoption if it had had hundreds of classes instead of the quite digestible 15 presently in its belly. OK, 24 total if you add the interfaces.</p>
<p>When browsing open source libraries I get happy feelings from projects with a limited number of source files &#8211; it gives me a sense that if I really wanted to I could read through the entire codebase and understand it.</p>
<p>But there&#8217;s a point where that simplicity inverts. Profit becomes debt. Without good abstractions in place every participant in the system ends up doing too much. At that point the question becomes: &#8220;Do I need to introduce a new layer of abstraction?&#8221;.</p>
<h2>Now You Have Two Problems</h2>
<p>The introduction of a system wide abstraction layer fueled by a mid feature code extraction will do one of two things: it will strengthen the system or it will weaken it. A bad abstraction might solve the immediate design issues (like duplication) just fine but end up adding complexity and reducing quality overall.</p>
<h2>Extensions? Timing?</h2>
<p>So anyway, I want Robotlegs to be extensible in a sensible way. Users should be able to install custom extensions easily. Those extensions need a way to hook into the context initialization process:</p>
<p>Some extensions may need to be configured before others. Some may need to pause the initialization process and wait for a resource to become available. Some might directly depend on others and may need to wait for those extensions to be fully configured before self initializing. Some may only come to life after the entire context has been initialized.</p>
<p>It&#8217;s clear that the initialization process needs to be asynchronous. But without a good abstraction in place for dealing with asynchronous processing the context will be burdened with co-ordinating a complex series of events. Event soup is not delicious.</p>
<h2>Events, Signals, Tokens, Tasks, Promises, Futures, Callbacks</h2>
<p>There are a number of patterns for dealing with asynchronous processes. They have wildly different properties.</p>
<p>Some are low level, like the callback pattern. Some are high level, like the promise pattern. Some are guaranteed to be asynchronous, while others have the potential to be synchronous. Some are only good for observing. Some can be terminated, while others can be suspended and resumed. Some can be composed and chained. Some necessitate the instantiation of throw-away objects and put stress on the garbage collector. Some put stress on the stack.</p>
<h2>Take Your Pick</h2>
<p>I wanted something fairly low level that enabled asynchronous processing without adding unnecessary overhead in the cases where things could be synchronous (or skipped entirely).</p>
<p>I tried a number of things. For the most part: floppy, verbose and annoying implementations that moved the core problems around in less-than-useful ways.</p>
<h2>Dispatch</h2>
<p>Slowly it dawned on me. In this case all I wanted was an asynchronous message dispatcher. With a well defined set of callback conventions I could write something resembling an Event Dispatcher but without the overhead of creating throw-away objects (events) and with the ability to suspend and resume the dispatch when desired:</p>
<p><a title="Async Conventions" href="https://github.com/robotlegs/robotlegs-framework/blob/version2/src/robotlegs/bender/core/async/readme.md">Some Async Conventions</a></p>
<p><a href="https://github.com/robotlegs/robotlegs-framework/blob/version2/src/robotlegs/bender/core/messaging/readme.md">The Message Dispatcher</a></p>
<h2>Initialization, Extension, Please Continue</h2>
<p>Very well. Suppose that context initialization comprises 3 steps: preInitialize, selfInitialize and postInitialize. When told to initialize the context moves through those steps in sequence. Anyone can listen in and halt the process as required at any point. What we end up with is in essence just a simple state machine where the observers have the potential to be guards.</p>
<h2>The End</h2>
<p>Well, that&#8217;s where the re-write started anyway.</p>
<p><a href="https://github.com/robotlegs/robotlegs-framework/tree/version2/src">Robotlegs 2</a></p>
<p>p.s. I dropped a bunch of stuff from the version2 branch. I&#8217;ll be going back to pull out any functionality that might have been lost shortly. If you come across anything that&#8217;s missing feel free to adapt it to the new codebase and send a pull request. Or drop an issue on the tracker. For quick reference, here&#8217;s the old version2 branch: <a href="https://github.com/robotlegs/robotlegs-framework/tree/version2-old">version2-old</a></p>
]]></content:encoded>
			<wfw:commentRss>http://shaun.boyblack.co.za/blog/2012/01/23/rl-reloaded/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Robotlegs &#8211; The Book</title>
		<link>http://shaun.boyblack.co.za/blog/2011/08/10/robotlegs-the-book/</link>
		<comments>http://shaun.boyblack.co.za/blog/2011/08/10/robotlegs-the-book/#comments</comments>
		<pubDate>Wed, 10 Aug 2011 11:49:00 +0000</pubDate>
		<dc:creator>shaun</dc:creator>
				<category><![CDATA[Resources]]></category>
		<category><![CDATA[Robotlegs]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[flex]]></category>

		<guid isPermaLink="false">http://shaun.boyblack.co.za/blog/?p=993</guid>
		<description><![CDATA[It&#8217;s here! The ActionScript Developer’s Guide to Robotlegs: http://oreilly.com/catalog/0636920021216 Written by the amazing @stray_and_ruby and @jhooks]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s here! The ActionScript Developer’s Guide to Robotlegs:</p>
<p><a href="http://oreilly.com/catalog/0636920021216">http://oreilly.com/catalog/0636920021216</a></p>
<p>Written by the amazing <a href="http://www.xxcoder.net/actionscript-developers-guide-to-robotlegs-done">@stray_and_ruby</a> and <a href="http://joelhooks.com/2011/07/16/robotlegs-book-actionscript-developer%E2%80%99s-guide-to-robotlegs/">@jhooks</a></p>
]]></content:encoded>
			<wfw:commentRss>http://shaun.boyblack.co.za/blog/2011/08/10/robotlegs-the-book/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Why X Is Better Than Robotlegs</title>
		<link>http://shaun.boyblack.co.za/blog/2011/08/06/why-x-is-better-than-robotlegs/</link>
		<comments>http://shaun.boyblack.co.za/blog/2011/08/06/why-x-is-better-than-robotlegs/#comments</comments>
		<pubDate>Sat, 06 Aug 2011 21:31:14 +0000</pubDate>
		<dc:creator>shaun</dc:creator>
				<category><![CDATA[Inspiration]]></category>
		<category><![CDATA[Robotlegs]]></category>
		<category><![CDATA[framework]]></category>

		<guid isPermaLink="false">http://shaun.boyblack.co.za/blog/?p=985</guid>
		<description><![CDATA[While the core Robotlegs developers do some preparatory undercover work on Robotlegs 2, some adventurous Robotlegs users have decided to take things into their own hands and start building their own ideal frameworks. I think this is great. The best ideas will almost certainly make their way back into RL2 in some shape or form. Some things that these framework experiments will probably have in common: Support for the Mediator pattern Support for the Command pattern Display-list processing (auto-wire) Dependency &#8230; <a href="http://shaun.boyblack.co.za/blog/2011/08/06/why-x-is-better-than-robotlegs/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>While the core Robotlegs developers do some preparatory undercover work on <a href="http://knowledge.robotlegs.org/discussions/suggestions/63-robotlegs-20-the-path-from-here">Robotlegs 2</a>, some adventurous Robotlegs users have decided to take things into their own hands and start building their own ideal frameworks. I think this is great. The best ideas will almost certainly make their way back into RL2 in some shape or form.<span id="more-985"></span></p>
<p>Some things that these framework experiments will probably have in common:</p>
<p>Support for the Mediator pattern<br />
Support for the Command pattern<br />
Display-list processing (auto-wire)<br />
Dependency Injection through <a href="https://github.com/tschneidereit/SwiftSuspenders">Swiftsuspenders</a></p>
<p>The first of these is <a href="https://github.com/squeedee/Boiler">Boiler</a> by <a href="http://devblog.vworkapp.com/">Rasheed Abdul-Aziz</a> (<a href="http://twitter.com/#!/squeedee">@squeedee</a>): <a href="http://devblog.vworkapp.com/post/8538689880/r">http://devblog.vworkapp.com/post/8538689880/r</a></p>
<p>Please have a look and give Squeedee some feedback. Some things that I like: convention over configuration, avoiding inheritance, the name!</p>
]]></content:encoded>
			<wfw:commentRss>http://shaun.boyblack.co.za/blog/2011/08/06/why-x-is-better-than-robotlegs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Too Much Of A Good Thing</title>
		<link>http://shaun.boyblack.co.za/blog/2011/07/31/too-much-of-a-good-thing/</link>
		<comments>http://shaun.boyblack.co.za/blog/2011/07/31/too-much-of-a-good-thing/#comments</comments>
		<pubDate>Sun, 31 Jul 2011 13:38:28 +0000</pubDate>
		<dc:creator>shaun</dc:creator>
				<category><![CDATA[Banter]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Robotlegs]]></category>
		<category><![CDATA[dependency injection]]></category>
		<category><![CDATA[interfaces]]></category>

		<guid isPermaLink="false">http://shaun.boyblack.co.za/blog/?p=981</guid>
		<description><![CDATA[As an enthusiastic programmer I tend to get overly excited when I discover a new technique &#8211; nails, nails everywhere for my shiny new hammer! It&#8217;s not a bad thing. I&#8217;ll abuse my newfound technique until I fully understand where it is and isn&#8217;t appropriate. Sometimes this takes a while.  Injection Everywhere Automated Dependency Injection is a handy way to wire the component parts of a system together. But systems are comprised of components at varying levels of abstraction. Some &#8230; <a href="http://shaun.boyblack.co.za/blog/2011/07/31/too-much-of-a-good-thing/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>As an enthusiastic programmer I tend to get overly excited when I discover a new technique &#8211; nails, nails everywhere for my shiny new hammer! It&#8217;s not a bad thing. I&#8217;ll abuse my newfound technique until I fully understand where it is and isn&#8217;t appropriate. Sometimes this takes a while. <span id="more-981"></span></p>
<h3>Injection Everywhere</h3>
<p>Automated Dependency Injection is a handy way to wire the component parts of a system together. But systems are comprised of components at varying levels of abstraction. Some are high-level, domain specific abstractions, whilst others are low-level implementation details.</p>
<p>If every object in a system is given the same level of importance, thrown into a DI container, and made available to every other object, the layers of abstraction become very hard to see. The container becomes a mixed bag of configuration details, value objects, sub-systems and goodness-knows-what-else.</p>
<p>Does a URL (a very specific, low-level configuration detail) really deserve to be sitting in a flat container right alongside a high-level, domain specific model? Certainly not!</p>
<p>It can be difficult to determine what is and what isn&#8217;t appropriate for automated Dependency Injection. It depends on the system you are building, and is something that comes with time and experience. I&#8217;m certainly still struggling with it on a daily basis.</p>
<p>Here&#8217;s a related post on the matter:</p>
<p><a href="http://www.higherorderlogic.com/blog/2011/07/30/is-dependency-injection-like-facebook/">http://www.higherorderlogic.com/blog/2011/07/30/is-dependency-injection-like-facebook/</a></p>
<h3>Interfaces Everywhere</h3>
<p>Program to interfaces, not implementations. Interfaces decouple us from implementations, they are good, but, as always, there are some subtleties worth considering.</p>
<p>Many languages support explicit interfaces: contracts with absolutely no implementation details. But every object also has an implicit interface &#8211; the public methods and properties exposed by that object.</p>
<p>Creating an explicit interface for an object that will only ever have a single implementation is a violation of the DRY principle as the explicit interface duplicates the implicit one.</p>
<p>This happens most often when the interface is large and acts as a &#8220;stand-in&#8221; describing a class rather than a piece of behaviour. Sure, you *could* swap out the implementation at some point, but honestly, so much of the implementation has already leaked out into the interface that there is very little point in doing so.</p>
<p>Program to interfaces, but remember that sometimes a small implicit interface is better than a large explicit one.</p>
<p>Another related post:</p>
<p><a href="http://lostechies.com/derickbailey/2008/10/20/dependency-inversion-abstraction-does-not-mean-interface/">http://lostechies.com/derickbailey/2008/10/20/dependency-inversion-abstraction-does-not-mean-interface/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://shaun.boyblack.co.za/blog/2011/07/31/too-much-of-a-good-thing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Robotlegs 2.0</title>
		<link>http://shaun.boyblack.co.za/blog/2011/06/11/robotlegs-2-0/</link>
		<comments>http://shaun.boyblack.co.za/blog/2011/06/11/robotlegs-2-0/#comments</comments>
		<pubDate>Sat, 11 Jun 2011 13:34:43 +0000</pubDate>
		<dc:creator>shaun</dc:creator>
				<category><![CDATA[Robotlegs]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[dependency injection]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[flex]]></category>

		<guid isPermaLink="false">http://shaun.boyblack.co.za/blog/?p=974</guid>
		<description><![CDATA[I&#8217;m super excited to be meeting with Stray, Till and Robert (sadly, Joel can&#8217;t make it) in a couple of weeks to discuss Robotlegs 2.0. We decided to keep the initial meetup small and focused, but development of the framework itself is completely open and anyone is free to contribute once we&#8217;ve nailed down some core priorities. More info over on the Robotlegs forums: http://knowledge.robotlegs.org/discussions/feedback/20-robotlegs-20-how-to-get-involved]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m super excited to be meeting with <a href="http://www.xxcoder.net/">Stray</a>, <a href="http://www.tillschneidereit.de/">Till</a> and <a href="http://flashblog.robertpenner.com/">Robert</a> (sadly, <a href="http://joelhooks.com/">Joel</a> can&#8217;t make it) in a couple of weeks to discuss <a href="http://www.robotlegs.org/">Robotlegs</a> 2.0.</p>
<p>We decided to keep the initial meetup small and focused, but development of the framework itself is completely <a href="https://github.com/robotlegs/robotlegs-framework">open</a> and anyone is free to contribute once we&#8217;ve nailed down some core priorities.</p>
<p>More info over on the Robotlegs <a href="http://knowledge.robotlegs.org/">forums</a>:</p>
<p><a href="http://knowledge.robotlegs.org/discussions/feedback/20-robotlegs-20-how-to-get-involved">http://knowledge.robotlegs.org/discussions/feedback/20-robotlegs-20-how-to-get-involved</a></p>
]]></content:encoded>
			<wfw:commentRss>http://shaun.boyblack.co.za/blog/2011/06/11/robotlegs-2-0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AS3 DI Metadata Tags</title>
		<link>http://shaun.boyblack.co.za/blog/2010/09/08/as3-di-metadata-tags/</link>
		<comments>http://shaun.boyblack.co.za/blog/2010/09/08/as3-di-metadata-tags/#comments</comments>
		<pubDate>Wed, 08 Sep 2010 17:56:48 +0000</pubDate>
		<dc:creator>shaun</dc:creator>
				<category><![CDATA[Banter]]></category>
		<category><![CDATA[Robotlegs]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[dependency injection]]></category>
		<category><![CDATA[metadata]]></category>

		<guid isPermaLink="false">http://shaun.boyblack.co.za/blog/?p=964</guid>
		<description><![CDATA[Spring Actionscript, Dawn, SmartyPants-IOC, Swiz, Parsley and SwiftSuspenders (used by Robotlegs) perform Dependency Injection. Moreover they can all perform automatic DI by parsing class metadata. It would be grand if the common DI related metadata tags could be standardised. That way we really could write code that is decoupled from any particular framework. I&#8217;ve started a little document over at GitHub: http://github.com/darscan/AS3-DI-Metadata I don&#8217;t know the libraries well enough to fill in all the details, so if you could fork the &#8230; <a href="http://shaun.boyblack.co.za/blog/2010/09/08/as3-di-metadata-tags/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.springactionscript.org/">Spring Actionscript</a>, <a href="http://github.com/sammyt/dawn">Dawn</a>, <a href="http://smartypants.expantra.net/">SmartyPants-IOC</a>, <a href="http://swizframework.org/">Swiz</a>, <a href="http://www.spicefactory.org/parsley/">Parsley</a> and <a href="http://github.com/tschneidereit/SwiftSuspenders">SwiftSuspenders</a> (used by <a href="http://www.robotlegs.org/">Robotlegs</a>) perform Dependency Injection.</p>
<p>Moreover they can all perform automatic DI by parsing class metadata. It would be grand if the common DI related metadata tags could be standardised. That way we really could write code that is decoupled from any particular framework.</p>
<p>I&#8217;ve started a little document over at GitHub:</p>
<p><a href="http://github.com/darscan/AS3-DI-Metadata">http://github.com/darscan/AS3-DI-Metadata</a></p>
<p>I don&#8217;t know the libraries well enough to fill in all the details, so if you could fork the repo and edit the doc that would be great! Also, the format/layout could be better, so if you have any ideas on that front.. edit away.</p>
]]></content:encoded>
			<wfw:commentRss>http://shaun.boyblack.co.za/blog/2010/09/08/as3-di-metadata-tags/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Linking to your GitHub code</title>
		<link>http://shaun.boyblack.co.za/blog/2010/08/19/linking-to-your-github-code/</link>
		<comments>http://shaun.boyblack.co.za/blog/2010/08/19/linking-to-your-github-code/#comments</comments>
		<pubDate>Wed, 18 Aug 2010 22:33:17 +0000</pubDate>
		<dc:creator>shaun</dc:creator>
				<category><![CDATA[Banter]]></category>
		<category><![CDATA[Robotlegs]]></category>
		<category><![CDATA[crybaby]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[github]]></category>

		<guid isPermaLink="false">http://shaun.boyblack.co.za/blog/?p=931</guid>
		<description><![CDATA[It&#8217;s pretty easy to link directly to a line of code in your GitHub repo: robotlegs/robotlegs-framework/blob/master/src/org/robotlegs/core/IContextProvider.as#L16 Don&#8217;t do that you naughty sausage! Your codebase will evolve (if all goes well), and line 16 will be replaced by a newer, shinier string of characters. Or, in this case, it&#8217;ll point to something that no longer exists. This, on the other hand, is more likely to stick around to haunt its author (me): robotlegs/robotlegs-framework/blob/v1.1.2/src/org/robotlegs/core/IContextProvider.as#L16 Select a tag before you link to your &#8230; <a href="http://shaun.boyblack.co.za/blog/2010/08/19/linking-to-your-github-code/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s pretty easy to link directly to a line of code in your <a title="GitHub" href="http://github.com/">GitHub</a> repo:</p>
<p><a href="http://github.com/robotlegs/robotlegs-framework/blob/master/src/org/robotlegs/core/IContextProvider.as#L16">robotlegs/robotlegs-framework/blob/<strong>master</strong>/src/org/robotlegs/core/IContextProvider.as#L16</a></p>
<p><strong>Don&#8217;t do that you naughty sausage!</strong> Your codebase will evolve (if all goes well), and line 16 will be replaced by a newer, shinier string of characters. Or, in this case, it&#8217;ll point to something that no longer exists.</p>
<p>This, on the other hand, is more likely to stick around to haunt its author (me):</p>
<p><a href="http://github.com/robotlegs/robotlegs-framework/blob/v1.1.2/src/org/robotlegs/core/IContextProvider.as#L16">robotlegs/robotlegs-framework/blob/<strong>v1.1.2</strong>/src/org/robotlegs/core/IContextProvider.as#L16</a></p>
<p>Select a tag before you link to your fancy code (&#8220;Switch Tags&#8221; under <a title="GitHub" href="http://github.com/">GitHub</a>&#8216;s &#8220;Source&#8221; menu).</p>
<p><img class="alignnone size-full wp-image-941" title="GitHub_Tags_435" src="http://shaun.boyblack.co.za/blog/wp-content/uploads/2010/08/GitHub_Tags_435.png" alt="" width="435" height="250" /></p>
]]></content:encoded>
			<wfw:commentRss>http://shaun.boyblack.co.za/blog/2010/08/19/linking-to-your-github-code/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tuning The Legs</title>
		<link>http://shaun.boyblack.co.za/blog/2010/03/10/tuning-the-legs/</link>
		<comments>http://shaun.boyblack.co.za/blog/2010/03/10/tuning-the-legs/#comments</comments>
		<pubDate>Wed, 10 Mar 2010 12:09:01 +0000</pubDate>
		<dc:creator>shaun</dc:creator>
				<category><![CDATA[Robotlegs]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[flex]]></category>

		<guid isPermaLink="false">http://shaun.boyblack.co.za/blog/?p=902</guid>
		<description><![CDATA[The Robotlegs MVCS implementation was designed to be convenient: quick-n-easy for common use cases. Nothing is free, of course, and that convenience comes at a cost. I want to highlight a few things that can be tweaked to improve performance for applications that really need it. Automatic Mediation In order to determine the scope of a view component, Robotlegs listens to the contextView for bubbling capture-phase ADDED_TO_STAGE events: MediatorMap.as#L233 MediatorMap.as#L260 Every display object that lands on the stage inside the &#8230; <a href="http://shaun.boyblack.co.za/blog/2010/03/10/tuning-the-legs/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>The Robotlegs MVCS implementation was designed to be convenient: quick-n-easy for common use cases. Nothing is free, of course, and that convenience comes at a cost. I want to highlight a few things that can be tweaked to improve performance for applications that really need it.<span id="more-902"></span></p>
<h3>Automatic Mediation</h3>
<p>In order to determine the scope of a view component, Robotlegs listens to the contextView for bubbling capture-phase ADDED_TO_STAGE events:</p>
<p><a href="http://github.com/robotlegs/robotlegs-framework/blob/v1.0.3/src/org/robotlegs/base/MediatorMap.as#L233">MediatorMap.as#L233</a><br />
<a href="http://github.com/robotlegs/robotlegs-framework/blob/v1.0.3/src/org/robotlegs/base/MediatorMap.as#L260">MediatorMap.as#L260</a></p>
<p>Every display object that lands on the stage inside the contextView is checked against a mapping dictionary. This can be quite expensive for complex display object hierarchies where there is a lot of re-parenting. It&#8217;s also the only option available if you want to keep your view components completely framework-unaware. If, however, you&#8217;re prepared to modify your components slightly (it&#8217;s a one-liner) then you can try out this utility:</p>
<p><a href="http://github.com/eidiot/robotlegs-utilities-LazyMediator">http://github.com/eidiot/robotlegs-utilities-LazyMediator</a></p>
<p>Instead of listening for ADDED_TO_STAGE events emitted by every component, we listen only for custom events dispatched by view components that explicitly require mediation.</p>
<p>Note: This utility currently only supports the MediatorMap and needs to be expanded to support the ViewMap. Fork and improve!</p>
<h3>Default Injection Points</h3>
<p>The actors in the MVCS package have a number of pre-configured injection points (dependencies). When you extend mvcs.Command all you are really doing is inheriting some dependencies:</p>
<p><a href="http://github.com/robotlegs/robotlegs-framework/blob/v1.0.3/src/org/robotlegs/mvcs/Command.as#L23">mvcs/Command.as#L23</a></p>
<p>Whilst handy, it is quite seldom that we actually use all of those in a given Command.</p>
<p>A much cleaner, and ever-so-slightly cheaper approach is to declare only the dependencies that you actually need. Instead of extending Actor or Command (this doesn&#8217;t work so well for the Mediator class), just create a vanilla class and declare your dependencies manually:</p>
<pre>public class MyCommand
{
	[Inject]
	public var injector:IInjector;

	public function execute():void
	{
		injector.mapClass( Vehicle, Car );
	}
}
</pre>
<p>Remember, the Robotlegs apparatus is already mapped for you if you need anything:</p>
<p><a href="http://github.com/robotlegs/robotlegs-framework/blob/v1.0.3/src/org/robotlegs/mvcs/Context.as#L190">mvcs/Context.as#L190</a></p>
<p>Notice that the IEventMap is not mapped as a value or singleton &#8211; you&#8217;ll get a new IEventMap instance whenever you ask for one.</p>
<p>That&#8217;s it for now!</p>
]]></content:encoded>
			<wfw:commentRss>http://shaun.boyblack.co.za/blog/2010/03/10/tuning-the-legs/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Robotlegs v1.0.0 &#8211; Out Now!</title>
		<link>http://shaun.boyblack.co.za/blog/2009/11/26/robotlegs-v1-0-0-out-now/</link>
		<comments>http://shaun.boyblack.co.za/blog/2009/11/26/robotlegs-v1-0-0-out-now/#comments</comments>
		<pubDate>Wed, 25 Nov 2009 23:18:56 +0000</pubDate>
		<dc:creator>shaun</dc:creator>
				<category><![CDATA[Robotlegs]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[flex]]></category>

		<guid isPermaLink="false">http://shaun.boyblack.co.za/blog/?p=895</guid>
		<description><![CDATA[Robotlegs AS3 v1.0.0 has been released A huge big &#8220;Thank You&#8221; to everyone involved. Let the &#8220;utility building&#8221; begin! Robotlegs is an automated dependency injection framework for Flash, Flex and AIR.]]></description>
			<content:encoded><![CDATA[<p><strong><a title="Robotlegs AS3" href="http://www.robotlegs.org/">Robotlegs AS3</a> v1.0.0 has been released </strong></p>
<p>A huge big &#8220;Thank You&#8221; to everyone involved. Let the &#8220;utility building&#8221; begin!</p>
<p><em>Robotlegs is an automated dependency injection framework for Flash, Flex and AIR.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://shaun.boyblack.co.za/blog/2009/11/26/robotlegs-v1-0-0-out-now/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

