title: Ruby mixins and calling super methods
body: <p>Ok, so I've been refactoring my code in my little Rails app in an effort to remove duplication, and in general make my life easier (as I like an easy life).  Part of this refactoring, has been to move code that's common to two of my models to a module that I can include where I need it.</p>
  
  <p>So far, so good. Looks like it's going to work out, but I've just hit a problem that I'm not sure how to get around.  The module (which I've called sendable), is just going to be the code that handles faxing, e-mailing, or printing a PDF of the document.  So, for example, I have a purchase order, and I have Internal Sales Orders (imaginatively abbreviated to ISO).</p>
  
  <p>The problem I've struck, is that I want some variables initialised (initialized for people who don't spell correctly :P ) after the object is loaded, so I've been using the <strong>after_initialize</strong> hook. No problem... until I start adding some more mixins.</p>
  
  <p>The problem I have, is that I can have an <strong><code>after_initialize</code></strong> in any one of my mixins, so I need to include a <strong>super</strong> call at the start to make sure the other mixin <strong><code>after_initialize</code></strong> calls get called.  Which is great, until I end up calling super and I get an error because there is no super to call.</p>
  
  <p>Here's a little example, in case I haven't been confusing enough:</p>
  
  <pre><code>class Iso &lt; ActiveRecord::Base
    include Shared::TracksSerialNumberExtension
    include Shared::OrderLines
    extend  Shared::Filtered
    include Sendable::Model
  
    validates_presence_of   :customer
    validates_associated    :lines
  
    owned_by                :customer
    order_lines             :despatched # Mixin
  
    tracks_serial_numbers   :items  # Mixin
  
    sendable :customer                      # Mixin
  
    attr_accessor :address
  
    def initialize( params = nil )
      super
      self.created_at ||= Time.now.to_date
    end
  end
  </code></pre>
  
  <p>So, if each one of the mixins have an after_initialize call, with a <strong>super</strong> call, how can I stop that last <strong>super</strong> call from raising the error? How can I test that the super method exists before I call it?</p>