Skip to content

Instantly share code, notes, and snippets.

@pasberth
Created April 21, 2012 07:00
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pasberth/2435010 to your computer and use it in GitHub Desktop.
Save pasberth/2435010 to your computer and use it in GitHub Desktop.
あるモジュール A の下に宣言されたクラスはすべて A を include するなら、 クラスの宣言を define_class というメソッドを作って行って class_defined が呼ばれるようにしたほうがいいかもしれない
module NameSpaceMethods
def define_class name, superclass=Object, &block
Class.allocate.tap do |klass|
const_set name, klass
klass.send :initialize, superclass, &block
module_or_class_defined klass
class_defined klass
end
end
def define_module name, &block
Module.allocate.tap do |mod|
const_set name, mod
mod.send :initialize, &block
module_or_class_defined mod
module_defined mod
end
end
alias namespace define_module
def module_or_class_defined module_or_class; end
def class_defined klass; end
def module_defined mod; end
end
class Module
include NameSpaceMethods
end
module Kernel
[ :namespace,
:define_class,
:define_module,
:class_defined,
:module_defined,
:module_or_class_defined
].each do |method|
module_eval(<<-DEFINE)
def #{method} *args, &block # def namespace *args, &block
Object.send :#{method}, *args, &block # Kernel.send :namespace, *args, &block
end # end
private :#{method} # private :namespace
DEFINE
end
end
module ExampleNameSpace
def class_defined klass
klass.send :include, ExampleNameSpace
end
define_class :InnerClass do
p ancestors # [ExampleNameSpace::InnerClass, Object, Kernel, BasicObject]
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment