From e1a07fadd9d045114e3006e43bd36dfa1d2ada52 Mon Sep 17 00:00:00 2001 From: Dan Buch Date: Sun, 2 Dec 2012 20:21:14 -0500 Subject: [PATCH] Working through an old @why post on metaprogramming since I'd like to make the JRuby rabbitmq stuff a bit less boilerplate. --- why/metaid/attr_abort.rb | 9 +++++++++ why/metaid/happy_truck.rb | 5 +++++ why/metaid/mail_truck.rb | 15 +++++++++++++++ why/metaid/metaid.rb | 19 +++++++++++++++++++ 4 files changed, 48 insertions(+) create mode 100644 why/metaid/attr_abort.rb create mode 100644 why/metaid/happy_truck.rb create mode 100644 why/metaid/mail_truck.rb create mode 100644 why/metaid/metaid.rb diff --git a/why/metaid/attr_abort.rb b/why/metaid/attr_abort.rb new file mode 100644 index 0000000..f5b90d6 --- /dev/null +++ b/why/metaid/attr_abort.rb @@ -0,0 +1,9 @@ +class Class + def attr_abort(*args) + abort "Please no more attributes today." + end +end + +class MyNewClass + attr_abort :id, :diagram, :telegram +end diff --git a/why/metaid/happy_truck.rb b/why/metaid/happy_truck.rb new file mode 100644 index 0000000..a35051c --- /dev/null +++ b/why/metaid/happy_truck.rb @@ -0,0 +1,5 @@ +require_relative 'mail_truck' + +class HappyTruck < MailTruck + company "Happy's -- We Bring the Mail, and That's It!" +end diff --git a/why/metaid/mail_truck.rb b/why/metaid/mail_truck.rb new file mode 100644 index 0000000..283a0fd --- /dev/null +++ b/why/metaid/mail_truck.rb @@ -0,0 +1,15 @@ +require_relative 'metaid' + +class MailTruck + attr_accessor :driver, :route + + def initialize(driver, route) + @driver, @route = driver, route + end + + def self.company(name) + meta_def :company do + name + end + end +end diff --git a/why/metaid/metaid.rb b/why/metaid/metaid.rb new file mode 100644 index 0000000..c4ff082 --- /dev/null +++ b/why/metaid/metaid.rb @@ -0,0 +1,19 @@ +class Object + def metaclass + class << self + self + end + end + + def meta_eval(&block) + metaclass.instance_eval(&block) + end + + def meta_def(name, &block) + meta_eval { define_method(name, &block) } + end + + def class_def(name, &block) + class_eval { define_method(name, &block) } + end +end