views:

45

answers:

1

Also, what does "self.send attr" do? Is attr assumed to be a private instance variable of the ActiveEngineer class? Are there any other issues with this code in terms of Ruby logic?

class Applicant < ActiveEngineer

  require 'ruby'
  require 'mad_skills'
  require 'oo_design'
  require 'mysql'

  validates :bachelors_degree

  def qualified?
    [:smart, :highly_productive, :curious, :driven, :team_player ].all? do
|attr|
      self.send attr
    end
  end
end

class Employer
  include TopTalent
  has_millions :subscribers, :include=>:mostly_women
  has_many :profits, :revenue
  has_many :recent_press, :through=>[:today_show, :good_morning_america,
                                     :new_york_times, :oprah_magazine]
  belongs_to :south_park_sf
  has_many :employees, :limit=>10

  def apply(you)
    unless you.build_successful_startups
      raise "Not wanted"
    end
    unless you.enjoy_working_at_scale
      raise "Don't bother"
    end
  end

  def work
    with small_team do
      our_offerings.extend you
      subscribers.send :thrill
      [:scaling, :recommendation_engines, :   ].each do |challenge|
        assert intellectual_challenges.include? challenge
      end
      %w(analytics ui collaborative_filtering scraping).each{|task|
task.build }
    end
  end

end

def to_apply
  include CoverLetter
  include Resume
end
+3  A: 

require 'mad_skills' loads the code in mad_skills.rb (or it loads mad_skills.so/.dll depending on which one exists). You need to require a file before being able to use classes, methods etc. defined in that file (though in rails files are automatically loaded when trying to access classes that have the same name as the file). Putting require inside a class definition, does not change its behaviour at all (i.e. putting it at the top of the file would not make a difference).

include MadSkills takes the module MadSkills and includes it into Applicant's inheritance chain, i.e. it makes all the methods in MadSkills available to instances of Applicant.

self.send attr executes the method with the name specified in attr on self and returns its return value. E.g. attr = "hello"; self.send(attr) will be the same as self.hello. In this case it executes the methods smart, highly_productive, curious, driven, and team_player and checks that all of them return true.

sepp2k
Great explanation. Thanks.
uzo