Class::Triggerみたいなの欲しいなと思ったので作ってみた。
moduleでもclassでも、include Tigerするだけで、onとemitが使えるようになるので、好きなところでonやemitすればいい。
moduleだとこういう感じ
require 'tiger' module YourModule include Tiger def self.hoge(*args) emit(:before_hoge, args) # ... emit(:after_hoge, args) end end YourModule.on(:before_hoge) do |args| puts "before hoge" end YourModule.on(:after_hoge) do |args| puts "after hoge" end YourModule.hoge({name: "hisaichi5518"}) #=> before hoge #=> after hoge
classの場合は、emit_allというのも使えるようになって多分便利。
require 'tiger' class YourClass include Tiger def self.hoge(*args) emit(:before_hoge, args) # ... emit(:after_hoge, args) end def fuga(*args) emit_all(:before_fuga, args) # ... emit_all(:after_fuga, args) end end YourClass.on(:before_hoge) do |args| puts "before hoge" end YourClass.on(:after_hoge) do |args| puts "after hoge" end YourClass.hoge({name: "hisaichi5518"}) #=> before hoge #=> after hoge YourClass.on(:before_fuga) do |args| puts "before fuga" end YourClass.on(:after_fuga) do |args| puts "after fuga" end your_class = YourClass.new your_class.on :before_fuga do puts "before_fuga: only your_class instance" end your_class.on :after_fuga do puts "after_fuga: only your_class instance" end your_class.fuga({name: "hisaichi5518"}) #=> before fuga #=> before_fuga: only your_class instance #=> after fuga #=> after_fuga: only your_class instance your_class2 = YourClass.new your_class2.fuga({name: "hisaichi5518"}) #=> before fuga #=> after fuga
rubygemsにもあげた。
https://rubygems.org/gems/tiger
https://github.com/hisaichi5518/tiger