Skip to content

Instantly share code, notes, and snippets.

@mike-burns
Created October 24, 2012 13:24
Show Gist options
  • Save mike-burns/3946031 to your computer and use it in GitHub Desktop.
Save mike-burns/3946031 to your computer and use it in GitHub Desktop.
Stop typoing #initialize
class User < Params.over(:first_name, :last_name)
def info
"I am a user: #{@first_name} #{@last_name}"
end
end
class Admin < User.params(:awesomeness_level)
def info
"I am a level #{@awesomeness_level} admin: #{@first_name} #{@last_name}"
end
end
class SuperAdmin < Admin.params { @awesomeness_level += 4 }
def info
"I am a level #{@awesomeness_level} admin: #{@first_name} #{@last_name}"
end
end
puts User.new('Mike', 'Awesomeface').info
puts Admin.new('Mike', 'Awesomeface', 1).info
puts SuperAdmin.new('Mike', 'Awesomeface', 1).info
class Params
def self.over(*args)
create_class(args)
end
def self.create_class(args, &block)
Class.new do
define_method(:initialize) do |*values|
args.each_with_index do |arg, offset|
instance_variable_set("@#{arg}", values[offset])
end
instance_eval(&block) unless block.nil?
end
define_singleton_method(:params) do |*more_args, &block|
Params.create_class(args + more_args, &block)
end
end
end
end
@croaky
Copy link

croaky commented Oct 24, 2012

Awesomeface

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment