class Object def metaclass; class << self; self; end; end def meta_eval &blk; metaclass.instance_eval &blk; end def meta_def name, &blk meta_eval { define_method name, &blk } end def class_def name, &blk class_eval { define_method name, &blk } end end class ProoflinkError < StandardError def self.message(msg) meta_def :default_message do; msg; end end def self.status(status) meta_def :default_status do; status; end end def self.code(code) meta_def :default_code do; code; end end message "default" status 100 code :default_error attr_accessor :message, :status, :code def initialize(msg=nil, status=nil, code=nil) super(msg || self.class.default_message) @message = msg || self.class.default_message @status = status || self.class.default_status @code = code || self.class.default_code end end class TestError < ProoflinkError message "test error" status 999 code :test_error end begin raise ProoflinkError rescue Exception => e puts e.inspect puts e.message puts e.status puts e.code end begin raise TestError rescue Exception => e puts e.inspect puts e.message puts e.status puts e.code end