Destroy All Software Blog

One Base Class to Rule Them All

Posted by Gary Bernhardt on 2011-09-05

Last week, I released base, a universal Base class for Ruby. Inheriting from it gives your class every instance method, class method, and constant from every module and class in the system. In a Rails app, it results in:

>> Base.new.methods.count
=> 6947

Let's see just how powerful this is. We'll start with a subclass of Base:

class Cantaloupe < Base
end

This class has the methods—all of them. Like, for example, size:

>> p Cantaloupe.new.size
=> 0

The size of the cantaloupe is zero. Fine. But you might be wondering, where did that size method come from? There are so many in Ruby. Is it Hash#size? Array#size? Enumerable#size? String#size?

The answer is: maybe. But the real answer is: this is Ruby! We just call methods and things happen! We don't have to worry about it! Isn't this great?!

You can call any method you want! Like, say, days from ActiveSupport:

>> Cantaloupe.new.days
TypeError: can't convert nil into String
    from base.rb:78:in `new'
    from base.rb:78:in `instantiate_regardless_of_argument_count'
    from base.rb:76:in `each'
    from base.rb:76:in `instantiate_regardless_of_argument_count'
    from base.rb:71:in `call_instance_method'
    from base.rb:47:in `call_method'
    from base.rb:43:in `each'
    from base.rb:43:in `call_method'
    from base.rb:37:in `method_missing'
    from (irb):3

Wait... why didn't that work? Whatever, it's not important. We're Ruby programmers; we have ways around errors! Like this:

>> Cantaloupe.new.days rescue 5
=> 5 

See? A cantaloupe has five days. Don't worry about it. It's fine.

You could even ask the Cantaloupe to find_by_email. Why worry about which model it will find? You'll find something by email; that's for sure!

In addition to all of this method-calling convenience, Base also leads to superior object oriented design. Remember the Law of Demeter? The one that says "talk to your friends, but not your friends' friends"? With Base, all other classes are your friends! You can call any of those 6,947 methods while complying with the Law of Demeter!

Since I'm sure you're itching to gem install it, base is available on GitHub. Its README contains more details, examples, and praise from the community. Enjoy!

(Disclaimer: believe it or not, I quite like Ruby. In fact, most of Destroy All Software's screencasts use it. If you're interested in actually building good software—doing the opposite of everything in this post—you might enjoy them.)