Skip to content

Instantly share code, notes, and snippets.

@takkkun
Last active December 18, 2015 22:09
Show Gist options
  • Select an option

  • Save takkkun/5852652 to your computer and use it in GitHub Desktop.

Select an option

Save takkkun/5852652 to your computer and use it in GitHub Desktop.
module Definable
def self.redefine(object, method_name, &process)
original_method = object.method(method_name)
object.define_singleton_method(method_name) do |*args, &block|
process[*args, &block]
original_method[*args, &block]
end
end
def definable(name)
Definable.redefine(self, :extended) do |object|
value = Value.new
object.define_singleton_method(name) { value }
Definable.redefine(object, :included) do |klass|
klass.__send__(:define_method, name) { value.eval }
end
end
end
class Value
def bind(value)
@value = value
@bound = true
end
def eval
raise 'a value is not bound yet' unless @bound
@value
end
end
end
Module.__send__(:include, Definable)
module Nyan
definable :nyan
end
module UnekoLike
extend Nyan
nyan.bind :uneko
end
module EtteLike
extend Nyan
nyan.bind :ette
end
class Uneko
include UnekoLike
end
class Ette
include EtteLike
end
p Uneko.new.nyan
p Ette.new.nyan
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment