<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Object Mentor Blog: Liskov Substitution Principle and the Ruby Core Libraries</title>
    <link>http://blog.objectmentor.com/articles/2007/02/17/liskov-substitution-principle-and-the-ruby-core-libraries</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description></description>
    <item>
      <title>Liskov Substitution Principle and the Ruby Core Libraries</title>
      <description>&lt;p&gt;There is a spirited discussion happening now on the ruby-talk list called &lt;a href="http://www.ruby-forum.com/topic/97965&lt;a href="""&gt;&amp;gt;Oppinions on &lt;span class="caps"&gt;RCR&lt;/span&gt; for dup on immutable classes&lt;/a&gt; (sic).&lt;/p&gt;


	&lt;p&gt;In the core Ruby classes, the &lt;code&gt;Kernel&lt;/code&gt; module, which is the root of everything, even &lt;code&gt;Object&lt;/code&gt;, defines a method called &lt;code&gt;dup&lt;/code&gt;, for duplicating objects. (There is also a &lt;code&gt;clone&lt;/code&gt; method with slightly different behavior that I won&amp;#8217;t discuss here.)&lt;/p&gt;


	&lt;p&gt;The problem is that some derived core classes throw an exception when &lt;code&gt;dup&lt;/code&gt; is called.&lt;/p&gt;


Specifically, as the ruby-talk discussion title says, it&amp;#8217;s the &lt;em&gt;immutable&lt;/em&gt; classes (&lt;code&gt;NilClass, FalseClass, TrueClass, Fixnum,&lt;/code&gt; and &lt;code&gt;Symbol&lt;/code&gt;) that do this. Consider, for example, the following &lt;strong&gt;irb&lt;/strong&gt; session: 
&lt;pre&gt;
irb 1:0&amp;gt; 5.respond_to? :dup
=&amp;gt; true
irb 2:0&amp;gt; 5.dup
TypeError: can't dup Fixnum
        from (irb):1:in `dup'
        from (irb):1
irb 3:0&amp;gt; 
&lt;/pre&gt;
If you don&amp;#8217;t know Ruby, the first line asks the &lt;code&gt;Fixnum&lt;/code&gt; object &lt;code&gt;5&lt;/code&gt; if it &lt;em&gt;responds to&lt;/em&gt; the method &lt;code&gt;dup&lt;/code&gt; (with the name expressed as a symbol, hence the&lt;/a&gt;). The answer is true, becuase this method is defined by the module &lt;code&gt;Kernel&lt;/code&gt;, which is included by the top-level class &lt;code&gt;Object&lt;/code&gt;, an ancestor of &lt;code&gt;Fixnum&lt;/code&gt;.

	&lt;p&gt;However, when you actually call &lt;code&gt;dup&lt;/code&gt; on &lt;code&gt;5&lt;/code&gt;, it raises &lt;code&gt;TypeError&lt;/code&gt;, as shown.&lt;/p&gt;


	&lt;p&gt;So, this looks like a classic &lt;a href="http://www.objectmentor.com/resources/articles/lsp.pdf"&gt;Liskov Substitution Principle&lt;/a&gt; violation. The term for this code smell is &lt;em&gt;Refused Bequest&lt;/em&gt; (&lt;em&gt;e.g.,&lt;/em&gt; see &lt;a href="http://www.soberit.hut.fi/mmantyla/BadCodeSmellsTaxonomy.htm"&gt;here&lt;/a&gt;) and it&amp;#8217;s typically fixed with the &lt;em&gt;refactoring&lt;/em&gt; &lt;a href="http://www.refactoring.com/catalog/replaceInheritanceWithDelegation.html"&gt;Replace Inheritance with Delegation&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;The email thread is about a proposal to change the library in one of several possible ways. One possibility is to remove &lt;code&gt;dup&lt;/code&gt; from the &lt;em&gt;immutable&lt;/em&gt; classes. This would eliminate the unexpected behavior in the example above, since &lt;code&gt;5.respond_to?(:dup)&lt;/code&gt; would return false, but it would still be an &lt;span class="caps"&gt;LSP&lt;/span&gt; violation, specifically it would still have the &lt;em&gt;Refused Bequest&lt;/em&gt; smell.&lt;/p&gt;


	&lt;p&gt;One scenario where the current behavior causes problems is doing a deep copy of an arbitrary object graph. For immutable objects, you would normally just want &lt;code&gt;dup&lt;/code&gt; to return the same object. It&amp;#8217;s immutable, right? Well, not exactly, since you can re-open classes and even objects to add and remove methods in Ruby (there are some limitations for the immutables&amp;#8230;).  So, if you thought you actually duplicated something and started messing with its methods, you would be surprised to find the original was &amp;#8220;also&amp;#8221; modified.&lt;/p&gt;


	&lt;p&gt;So, how serious is this &lt;span class="caps"&gt;LSP&lt;/span&gt; issue (one of several)? When I pointed out the problem in the discussion, one respondent, Robert Dober, said the following (edited slightly):&lt;/p&gt;


	&lt;p&gt;&lt;i&gt;
I would say that &lt;span class="caps"&gt;LSP&lt;/span&gt; does not apply here simply because in Ruby we do
not have that kind of contract. In order to apply &lt;span class="caps"&gt;LSP&lt;/span&gt; we need to say at a point we have an object of class &lt;code&gt;Base&lt;/code&gt;, for example. (let the gods forgive me that I use Java)&lt;/i&gt;
&lt;pre&gt;
void aMethod(final Base b){
   ....
}
&lt;/pre&gt;
&lt;i&gt;and we expect this to work whenever we call aMethod with an object
that is a Base.
Anyway the compiler would not really allow otherwise.&lt;/i&gt;
&lt;pre&gt;
SubClass sc;  // subclassing Base od course
aMethod( sc ); // this is expected to work (from the type POV).
&lt;/pre&gt;&lt;/p&gt;


	&lt;p&gt;&lt;i&gt;Such things just do not exist in Ruby, I believe that Ruby has
explained something to me:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;OO Languages are Class oriented languages&lt;/li&gt;
		&lt;li&gt;Dynamic Languages are Object oriented languages.&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;Replace Class with Type and you see what I mean.&lt;/p&gt;


	&lt;p&gt;This is all very much &lt;span class="caps"&gt;IMHO&lt;/span&gt; of course but I feel that the Ruby
community has made me evolve a lot away from &amp;#8220;Class oriented&amp;#8221;.&lt;/i&gt;&lt;/p&gt;


	&lt;p&gt;He&amp;#8217;s wrong that the compiler protects you in Java; you can still throw exceptions, &lt;em&gt;etc.&lt;/em&gt; The &lt;span class="caps"&gt;JDK&lt;/span&gt; Collection classes have &lt;em&gt;Refused Bequests&lt;/em&gt;. Besides that, however, he makes some interesting points.&lt;/p&gt;


	&lt;p&gt;As a long-time Java programmer, I&amp;#8217;m instinctively uncomfortable with &lt;span class="caps"&gt;LSP&lt;/span&gt; violations. Yet, the Ruby &lt;span class="caps"&gt;API&lt;/span&gt; is very nice to work with, so maybe a little &lt;span class="caps"&gt;LSP&lt;/span&gt; violation isn&amp;#8217;t so bad?&lt;/p&gt;


	&lt;p&gt;As Robert says, we approach our designs differently in dynamic &lt;em&gt;vs.&lt;/em&gt; static languages. In Ruby, you almost never use the &lt;code&gt;is_a?&lt;/code&gt; and &lt;code&gt;kind_of?&lt;/code&gt; methods to check for type. Instead, you follow the &lt;em&gt;duck typing&lt;/em&gt; philosophy (&amp;#8220;If it acts like a duck, it must be a duck&amp;#8221;); you rely on &lt;code&gt;respond_to?&lt;/code&gt; to decide if an object does what you want.&lt;/p&gt;


	&lt;p&gt;In the case of &lt;code&gt;dup&lt;/code&gt; for the immutable classes, I would prefer that they not implement the method, rather than throw an exception. However, that would still violate &lt;span class="caps"&gt;LSP&lt;/span&gt;.&lt;/p&gt;


	&lt;p&gt;So, can we still satisfy &lt;span class="caps"&gt;LSP&lt;/span&gt; and also have rich base classes and modules?&lt;/p&gt;


	&lt;p&gt;There are many examples of &lt;em&gt;traits&lt;/em&gt; that one object might or should support, but not another. (Those of you Java programmers might ask yourself why all objects support &lt;code&gt;toString&lt;/code&gt;, for example. Why not also &lt;code&gt;toXML&lt;/code&gt;...?)&lt;/p&gt;


	&lt;p&gt;Coming from an &lt;a href="http://aspectprogramming.com"&gt;&lt;span class="caps"&gt;AOP&lt;/span&gt;&lt;/a&gt; background, I would rather see an architecture where &lt;code&gt;dup&lt;/code&gt; is added only to those classes and modules that can support it. It shouldn&amp;#8217;t be part of the standard &amp;#8220;signature&amp;#8221; of &lt;code&gt;Kernel&lt;/code&gt;, but it should be present when code actually needs it.&lt;/p&gt;


In fact, Ruby makes this sort of &lt;span class="caps"&gt;AOP&lt;/span&gt; &lt;a href="c2.com/cgi/wiki?AspectsAndDynamicLanguages"&gt;easy&lt;/a&gt; to implement. Maybe &lt;code&gt;Kernel&lt;/code&gt;, &lt;code&gt;Module&lt;/code&gt;, and &lt;code&gt;Object&lt;/code&gt; should be refactored into smaller pieces and programmers should declaratively mixin the &lt;em&gt;traits&lt;/em&gt; they need. Imagine something like the following:
&lt;pre&gt;
irb 1:0&amp;gt; my_obj.respond_to? :dup
=&amp;gt; false
irb 2:0&amp;gt; include 'DupableTrait'  
irb 2:0&amp;gt; my_obj.respond_to? :dup
=&amp;gt; true
irb 4:0&amp;gt; def dup_if_possible items
irb 5:1&amp;gt;  items.map {|item| item.respond_to?(:dup) ? item.dup : item}
irb 6:1&amp;gt; end
...
&lt;/pre&gt;
In other words, &lt;code&gt;Kernel&lt;/code&gt; no longer &amp;#8220;exposes the &lt;code&gt;dup&lt;/code&gt; abstraction&amp;#8221;, by default, but the &lt;code&gt;DupableTrait&lt;/code&gt; module &amp;#8220;magically&amp;#8221; adds &lt;code&gt;dup&lt;/code&gt; to all the classes that can support it. This way, we preserve &lt;span class="caps"&gt;LSP&lt;/span&gt;, streamline the core classes and modules (&lt;a href="http://www.objectmentor.com/resources/articles/srp"&gt;&lt;span class="caps"&gt;SRP&lt;/span&gt;&lt;/a&gt; and &lt;a href="http://www.objectmentor.com/resources/articles/isp.pdf"&gt;&lt;span class="caps"&gt;ISP&lt;/span&gt;&lt;/a&gt; anyone?), yet we have the flexibility we need, on demand.</description>
      <pubDate>Sat, 17 Feb 2007 14:20:00 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:767b95e8-95d2-45dd-8aa0-09dfb4fe92ec</guid>
      <author>Dean Wampler</author>
      <link>http://blog.objectmentor.com/articles/2007/02/17/liskov-substitution-principle-and-the-ruby-core-libraries</link>
      <category>Dean's Deprecations</category>
      <category>Dynamic Languages</category>
      <category>Design Principles</category>
      <category>Ruby</category>
      <category>object-oriented design</category>
      <category>Liskov Substitution Principle</category>
      <category>LSP</category>
      <trackback:ping>http://blog.objectmentor.com/articles/trackback/188</trackback:ping>
    </item>
    <item>
      <title>"Liskov Substitution Principle and the Ruby Core Libraries" by grad school personal statement</title>
      <description>&lt;p&gt;I am absolutely amazed at how terrific the stuff is on this site. I have saved this webpage and I truly intend on visiting the site in the upcoming days. Keep up the excellent work!&lt;/p&gt;</description>
      <pubDate>Mon, 19 Dec 2011 00:30:28 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:0b1711ed-c6e7-4ef2-8158-eb22621ba9cf</guid>
      <link>http://blog.objectmentor.com/articles/2007/02/17/liskov-substitution-principle-and-the-ruby-core-libraries#comment-189013</link>
    </item>
    <item>
      <title>"Liskov Substitution Principle and the Ruby Core Libraries" by bhutan travel guide</title>
      <description>&lt;p&gt;I was really impressed. This is really interesting topic. Thank you very much!&lt;/p&gt;</description>
      <pubDate>Sun, 27 Nov 2011 10:02:07 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:dc20d45e-2ff5-4ce8-98b6-c8ba0446c00c</guid>
      <link>http://blog.objectmentor.com/articles/2007/02/17/liskov-substitution-principle-and-the-ruby-core-libraries#comment-178891</link>
    </item>
    <item>
      <title>"Liskov Substitution Principle and the Ruby Core Libraries" by exit and emergency lights</title>
      <description>&lt;p&gt;I just like to give a huge thumbs up for the great info you have here on this post. I will be coming back to your blog for more soon.&lt;/p&gt;</description>
      <pubDate>Sun, 27 Nov 2011 10:00:40 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:b9a153c0-a0c3-494d-9a6f-bbfd420903bd</guid>
      <link>http://blog.objectmentor.com/articles/2007/02/17/liskov-substitution-principle-and-the-ruby-core-libraries#comment-178890</link>
    </item>
    <item>
      <title>"Liskov Substitution Principle and the Ruby Core Libraries" by air-con repair</title>
      <description>&lt;p&gt;An interesting discussion is worth comment.glad i came across your post, very informative indeed.&lt;/p&gt;</description>
      <pubDate>Sun, 27 Nov 2011 09:58:43 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:df809d0a-dfdf-4641-babd-89ea86c0aad7</guid>
      <link>http://blog.objectmentor.com/articles/2007/02/17/liskov-substitution-principle-and-the-ruby-core-libraries#comment-178889</link>
    </item>
    <item>
      <title>"Liskov Substitution Principle and the Ruby Core Libraries" by tv guide</title>
      <description>&lt;p&gt;thanks for the great stuff you have written!&lt;/p&gt;</description>
      <pubDate>Sun, 27 Nov 2011 04:31:25 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:7279ba17-5b11-4641-8380-a808571acd87</guid>
      <link>http://blog.objectmentor.com/articles/2007/02/17/liskov-substitution-principle-and-the-ruby-core-libraries#comment-178875</link>
    </item>
    <item>
      <title>"Liskov Substitution Principle and the Ruby Core Libraries" by Moncler Piumini</title>
      <description>&lt;p&gt;Ma assicuratevi di carburante la vostra moto sport touring sulla strada, le fermate benzina deve essere pianificato con cura &lt;a href="http://www.monclersitoufficiale-italy.com/" rel="nofollow"&gt; Moncler Piumini &lt;/a&gt; su questa strada . Per fortuna che l&amp;#8217;inverno &#232; stato un mite. Vegetali ChilliesThis caldo vi aiuter&#224; a rendere la tua vita sessuale. Questo tipo di abbigliamento &#232; disponibile per persone di diverse fasce d&amp;#8217;et&#224; e sono disponibili in varie taglie, colori e materiali. Ma se lo fai poi scegliere &lt;a href="http://www.monclersitoufficiale-italy.com/" rel="nofollow"&gt; 2011 Moncler Vendita &lt;/a&gt; in vendita una porzione pi&#249; piccola, condividere con un amico o portare a casa con voi per pi&#249; tardi. 18. Ecco alcuni consigli per aiutarvi a &lt;a href="http://www.monclersitoufficiale-italy.com/" rel="nofollow"&gt; Moncler Giubbotto &lt;/a&gt; quella giacca moto della durata di anni. Sono inoltre dotate di polsini regolabili con soffietto e per stanza in pi&#249;, hanno anche funzione di gomiti articolati.&lt;/p&gt;</description>
      <pubDate>Mon, 21 Nov 2011 20:33:12 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:5daa52cf-693c-4359-9f05-d5fc848d3748</guid>
      <link>http://blog.objectmentor.com/articles/2007/02/17/liskov-substitution-principle-and-the-ruby-core-libraries#comment-176209</link>
    </item>
    <item>
      <title>"Liskov Substitution Principle and the Ruby Core Libraries" by travel deals</title>
      <description>&lt;p&gt;Wow, this was a really quality post. In theory I&amp;#8217;d like to write like this too &amp;#8211; taking time and real effort to make a good article&lt;/p&gt;</description>
      <pubDate>Wed, 09 Nov 2011 01:01:51 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:170a4115-9210-46a7-bf3d-9793f97d8c65</guid>
      <link>http://blog.objectmentor.com/articles/2007/02/17/liskov-substitution-principle-and-the-ruby-core-libraries#comment-170357</link>
    </item>
    <item>
      <title>"Liskov Substitution Principle and the Ruby Core Libraries" by travel deals</title>
      <description>&lt;p&gt;Wow, this was a really quality post. In theory I&amp;#8217;d like to write like this too &amp;#8211; taking time and real effort to make a good article&lt;/p&gt;</description>
      <pubDate>Wed, 09 Nov 2011 00:59:45 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:f35cfe2c-1c7b-48e5-bd1a-d130cd7370be</guid>
      <link>http://blog.objectmentor.com/articles/2007/02/17/liskov-substitution-principle-and-the-ruby-core-libraries#comment-170355</link>
    </item>
    <item>
      <title>"Liskov Substitution Principle and the Ruby Core Libraries" by storage Singapore</title>
      <description>&lt;p&gt;I confess, I have not visited this website in a long time because of my blog , nonetheless it was another delight to see such a significant subject on long distance running and I thank you for making people more attentive on possible issues.&lt;/p&gt;</description>
      <pubDate>Wed, 09 Nov 2011 00:55:48 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:b040eb4f-811e-496b-b590-330ecac6f677</guid>
      <link>http://blog.objectmentor.com/articles/2007/02/17/liskov-substitution-principle-and-the-ruby-core-libraries#comment-170354</link>
    </item>
    <item>
      <title>"Liskov Substitution Principle and the Ruby Core Libraries" by christian louboutin</title>
      <description>&lt;p&gt;good post, i think so.Thank you!&lt;/p&gt;</description>
      <pubDate>Thu, 03 Nov 2011 12:00:21 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:e61297c9-9fa3-4f48-b9bb-dd132bac0e5f</guid>
      <link>http://blog.objectmentor.com/articles/2007/02/17/liskov-substitution-principle-and-the-ruby-core-libraries#comment-167756</link>
    </item>
    <item>
      <title>"Liskov Substitution Principle and the Ruby Core Libraries" by canada goose jakke</title>
      <description>&lt;p&gt;Som topm&#248;det &lt;a href="http://www.canadagooseoutletdk.com/" rel="nofollow"&gt;canada goose jakke&lt;/a&gt; v&#230;rt, har hundreder &lt;a href="http://www.canadagooseoutletdk.com/" rel="nofollow"&gt;canada goose&lt;/a&gt; af millioner v&#230;rd at Berlusconi forberedt &lt;a href="http://www.canadagooseoutletdk.com/" rel="nofollow"&gt;canada goose outlet&lt;/a&gt; en gave til ledere: v&#230;rdien af GBP 500 &lt;a href="http://www.belstaff-outlet.de/" rel="nofollow"&gt;belstaff outlet&lt;/a&gt; limited edition fashion frakke.Denne m&#248;rke &lt;a href="http://www.belstaff-sito-ufficiale.com/" rel="nofollow"&gt;belstaff&lt;/a&gt; bl&#229; frakke siges at v&#230;re &amp;#8220;Pr&#230;sidentens frakke&amp;#8221;, udskrives &lt;a href="http://www.canadagooseoutletdk.com/" rel="nofollow"&gt;canada goose jakke&lt;/a&gt; over Italien flag, udf&#248;rt &lt;a href="http://www.canadagooseoutletdk.com/canada-goose-banff-parka-2100/" rel="nofollow"&gt;Canada Goose Banff Parka&lt;/a&gt; af fashion brands beidafu og hr. Berlusconis samarbejde, alt ovenst&#229;ende er gamle Bay autograph &lt;a href="http://www.canadagooseoutletdk.com/canada-goose-expedition-parka-drenge-2400/" rel="nofollow"&gt;Canada Goose Expedition Parka drenge&lt;/a&gt;.Hvad ang&#229;r st&#248;rrelse, og gav en af lederne af alle lande er fremstillet af deres fotos og &lt;a href="http://www.canadagooseoutletdk.com/canada-goose-expedition-parka-kvinders-2500/" rel="nofollow"&gt;Canada Goose Expedition Parka Kvinders&lt;/a&gt; videoer  af h&#248;jden af organ oplysninger skr&#230;ddersyet til.Beidafu m&#230;rke bliver &lt;a href="http://www.canadagooseoutletdk.com/canada-goose-expedition-parka-m?nd-2700/" rel="nofollow"&gt;Canada Goose Expedition Parka M?nd&lt;/a&gt; darling af fashion  verden i de seneste &#229;r, mange store stjerner har passeret af m&#230;rke &lt;a href="http://www.canadagooseoutletdk.com/canada-goose-kvinder-vest-3600/" rel="nofollow"&gt;Canada Goose Kvinder Vest&lt;/a&gt; t&#248;j, s&#229;som USA stjernerne Brad Pitt og George Clooney, og Storbritannien har ikke if&#248;rt fodbold stjerne &lt;a href="http://www.canadagooseoutletdk.com/canada-goose-montebello-parka-2900/" rel="nofollow"&gt;Canada Goose Montebello Parka&lt;/a&gt; David  Beckham.&lt;/p&gt;</description>
      <pubDate>Sun, 30 Oct 2011 21:02:38 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:96e544f1-1705-4a1c-847b-00cff58755f3</guid>
      <link>http://blog.objectmentor.com/articles/2007/02/17/liskov-substitution-principle-and-the-ruby-core-libraries#comment-165843</link>
    </item>
    <item>
      <title>"Liskov Substitution Principle and the Ruby Core Libraries" by flac converter</title>
      <description>&lt;p&gt;good post, i think so.Thank you!&lt;/p&gt;</description>
      <pubDate>Thu, 27 Oct 2011 03:21:43 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:a39b308e-d3b3-47f3-b276-c67abb046f17</guid>
      <link>http://blog.objectmentor.com/articles/2007/02/17/liskov-substitution-principle-and-the-ruby-core-libraries#comment-164509</link>
    </item>
    <item>
      <title>"Liskov Substitution Principle and the Ruby Core Libraries" by Stivali Ugg Paisley</title>
      <description>&lt;p&gt;&lt;a href="http://www.uggscarpe2011.com/ugg-paisley-stivali-6/" rel="nofollow"&gt;Stivali Ugg Paisley&lt;/a&gt; , Dal, professionisti nativo di solito non sono pronte a prendere il nuove opportunit&#224; in Libia di conseguenza stanno migrando in massa verso altri paesi, la probabilit&#224; di una carriera per i cittadini internazionali &#232; sicuramente ancora pi&#249; significant.Such grande afflusso di stranieri &#232; dotato di funzionari richiesto di produrre una legge a seconda del trenta per cento di ogni lavoratori impiegati dalle organizzazioni importati devono rimanere nationals.Nevertheless libico, commercianti e altre ditte non si dovrebbe mai sono pi&#249; spesso felici usando la decisione come si suol dire, &#232; quasi impossibile trovare quella percentuale di workforce.Ultimately libico, il vostro obiettivo conti&lt;/p&gt;</description>
      <pubDate>Tue, 18 Oct 2011 22:33:17 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:f1f8d111-06dd-4ecd-b2c4-f65c7ece8c96</guid>
      <link>http://blog.objectmentor.com/articles/2007/02/17/liskov-substitution-principle-and-the-ruby-core-libraries#comment-159220</link>
    </item>
    <item>
      <title>"Liskov Substitution Principle and the Ruby Core Libraries" by Ashley Bowling</title>
      <description>&lt;p&gt;Expense&#8212;where employee business-related expenses are entered&lt;/p&gt;</description>
      <pubDate>Sun, 16 Oct 2011 05:35:48 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:2c8e954e-6780-4006-847e-3e6c04b37c5e</guid>
      <link>http://blog.objectmentor.com/articles/2007/02/17/liskov-substitution-principle-and-the-ruby-core-libraries#comment-157360</link>
    </item>
    <item>
      <title>"Liskov Substitution Principle and the Ruby Core Libraries" by juicy couture tracksuits</title>
      <description>&lt;p&gt;from many days i badly required these info . thanks for it &#8230;.. from here i got what i want&lt;/p&gt;</description>
      <pubDate>Tue, 27 Sep 2011 20:31:50 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:8f0b8f3c-2692-4e3a-bd0a-04b43a9b53b4</guid>
      <link>http://blog.objectmentor.com/articles/2007/02/17/liskov-substitution-principle-and-the-ruby-core-libraries#comment-146283</link>
    </item>
    <item>
      <title>"Liskov Substitution Principle and the Ruby Core Libraries" by DR OZ african Mango </title>
      <description>&lt;p&gt;When I at first left a comment I clicked the &amp;#8220;Notify me when new comments are added&amp;#8221; checkbox and now each time a comment is added I get three notification emails with the same comment. Is there any way you can take away people from that service? Thanks a lot!&lt;/p&gt;</description>
      <pubDate>Tue, 27 Sep 2011 11:50:48 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:c16562d5-9641-47b5-af79-7f1f164eb88f</guid>
      <link>http://blog.objectmentor.com/articles/2007/02/17/liskov-substitution-principle-and-the-ruby-core-libraries#comment-146166</link>
    </item>
    <item>
      <title>"Liskov Substitution Principle and the Ruby Core Libraries" by louboutin</title>
      <description>At some time extensive most effective low-priced MBT Kafala Boots and shoes discounted design all these cycles boots and shoes, &lt;a href="http://www.louboutinchaussures-fr.com/jimmy-choo-jimmy-choo-pompes-39_35/" rel="nofollow"&gt;Jimmy Choo Pompes&lt;/a&gt;you may the radical the answers.&lt;a href="http://www.louboutinchaussures-fr.com/jimmy-choo-jimmy-choo-sandales-39_36/" rel="nofollow"&gt;Jimmy Choo Sandales&lt;/a&gt; Quite a few job opportunities have to have you actually often be humiliated with you, fully to the specific shape, ankles, 
&lt;p&gt;&lt;a href="http://www.north-face-jakke.com/" rel="nofollow"&gt;&lt;em&gt;&lt;strong&gt;North Face Apex Bionic Kvinder Jakker&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;plus thighs and leg, &lt;p&gt;&lt;a href="http://www.north-face-jakke.com/" rel="nofollow"&gt;&lt;em&gt;&lt;strong&gt;the north face&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;plus improved during losing fat laden calories might move barefoot in the inclusion. In that case keep account. 

	&lt;p&gt;December 2012 will be to can come&lt;a href="http://www.canadagoosejakkedk.com" rel="nofollow"&gt;&lt;strong&gt;canada goose jakke&lt;/strong&gt;&lt;/a&gt;, lots of believers live 2012 is just about the most important issue with discourse. mbt internet profit internationally renowned students will be guessing devastating incidents which is nearly anything. Let&#8217; vertisements evaluate ways to live 2012&lt;a href="http://www.canadagoosejakkedk.com" rel="nofollow"&gt;&lt;strong&gt;canada goose&lt;/strong&gt;&lt;/a&gt;
, principally around the best way far better create you actually for any predictable.&lt;/p&gt;</description>
      <pubDate>Fri, 16 Sep 2011 22:32:06 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:47bcff3c-f864-492e-9e92-92451cc49dd2</guid>
      <link>http://blog.objectmentor.com/articles/2007/02/17/liskov-substitution-principle-and-the-ruby-core-libraries#comment-141524</link>
    </item>
    <item>
      <title>"Liskov Substitution Principle and the Ruby Core Libraries" by Web Designing </title>
      <description>&lt;p&gt;Lots of knowledge I got from your blog thanks.&lt;/p&gt;</description>
      <pubDate>Mon, 12 Sep 2011 06:15:50 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:0fb729d7-c7df-4e7b-b4c5-290827251440</guid>
      <link>http://blog.objectmentor.com/articles/2007/02/17/liskov-substitution-principle-and-the-ruby-core-libraries#comment-139339</link>
    </item>
    <item>
      <title>"Liskov Substitution Principle and the Ruby Core Libraries" by dvd ripper</title>
      <description>&lt;p&gt;Thank you for sharing, I&#8217;ll definitely dig deeper into it&lt;/p&gt;</description>
      <pubDate>Sun, 11 Sep 2011 07:21:38 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:cf574078-e0b2-40fb-b271-d648f13a0a98</guid>
      <link>http://blog.objectmentor.com/articles/2007/02/17/liskov-substitution-principle-and-the-ruby-core-libraries#comment-139218</link>
    </item>
    <item>
      <title>"Liskov Substitution Principle and the Ruby Core Libraries" by Jewellery XY</title>
      <description>&lt;p&gt;Great article , very informative.
For a guide to &lt;a href="http://www.jewelleryxy.com/list-of-gemstones.html" rel="nofollow"&gt; gemstones &lt;/a&gt; check out our site&lt;/p&gt;</description>
      <pubDate>Wed, 07 Sep 2011 05:08:51 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:9b8d5928-51bb-4ff3-ae7f-8fe220e27e36</guid>
      <link>http://blog.objectmentor.com/articles/2007/02/17/liskov-substitution-principle-and-the-ruby-core-libraries#comment-138071</link>
    </item>
    <item>
      <title>"Liskov Substitution Principle and the Ruby Core Libraries" by beats by dre store</title>
      <description>&lt;p&gt;school to see her, afraid of boring so far way to buy the basketball magazine, all the way to see the ecstatic&lt;a href="http://www.drdrebeatsheadphones-australia.com" rel="nofollow"&gt;high quality headphones&lt;/a&gt;
&lt;a href="http://www.drdrebeatsheadphones-australia.com" rel="nofollow"&gt;new design headphones&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Tue, 23 Aug 2011 03:20:16 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:618722c3-3ced-4b9f-9760-3c7da13fc429</guid>
      <link>http://blog.objectmentor.com/articles/2007/02/17/liskov-substitution-principle-and-the-ruby-core-libraries#comment-131677</link>
    </item>
    <item>
      <title>"Liskov Substitution Principle and the Ruby Core Libraries" by swimsuit coverups</title>
      <description>&lt;p&gt;Experts often possess more data than judgment.&lt;/p&gt;</description>
      <pubDate>Sun, 14 Aug 2011 16:34:02 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:e021f51b-1ecb-4810-986a-6924181fbbdc</guid>
      <link>http://blog.objectmentor.com/articles/2007/02/17/liskov-substitution-principle-and-the-ruby-core-libraries#comment-128033</link>
    </item>
    <item>
      <title>"Liskov Substitution Principle and the Ruby Core Libraries" by audio converter </title>
      <description>&lt;p&gt;Good Information Very nice post.&lt;/p&gt;</description>
      <pubDate>Tue, 02 Aug 2011 21:21:17 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:3d5c6739-5b94-4514-b447-8b2dcc2285a3</guid>
      <link>http://blog.objectmentor.com/articles/2007/02/17/liskov-substitution-principle-and-the-ruby-core-libraries#comment-123186</link>
    </item>
    <item>
      <title>"Liskov Substitution Principle and the Ruby Core Libraries" by Community Service Online</title>
      <description>&lt;p&gt;I am learning Ruby. I&amp;#8217;ve got a clear idea about Fixnum object 5 from your blog. It&amp;#8217;s really helpful.&lt;/p&gt;</description>
      <pubDate>Thu, 30 Jun 2011 15:44:33 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:6b5772e3-3246-46a5-9228-7064087279c7</guid>
      <link>http://blog.objectmentor.com/articles/2007/02/17/liskov-substitution-principle-and-the-ruby-core-libraries#comment-113401</link>
    </item>
    <item>
      <title>"Liskov Substitution Principle and the Ruby Core Libraries" by firepit</title>
      <description>&lt;p&gt;You can enjoy more your family time with a fire pit in your patio, enjoy your cold nights, too.&lt;/p&gt;</description>
      <pubDate>Sun, 19 Jun 2011 18:38:17 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:7e1f3b72-a7e7-4b9e-aadf-7aa73b88a55d</guid>
      <link>http://blog.objectmentor.com/articles/2007/02/17/liskov-substitution-principle-and-the-ruby-core-libraries#comment-112630</link>
    </item>
  </channel>
</rss>

