Created
March 15, 2014 06:10
-
-
Save melborne/9562475 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require "./onetime" | |
module CoreExt | |
refine String do | |
def ~ | |
margin = scan(/^ +/).map(&:size).min | |
gsub(/^ {#{margin}}/, '') | |
end | |
end | |
end | |
class MissionImpossible | |
using CoreExt | |
extend OneTime | |
def mission_exist? | |
!!methods.detect { |m| m==:mission } | |
end | |
def mission(name) | |
mission_template name: name, | |
status: ~<<-ST, | |
昨夜、プロジェクトX内において | |
NullObjectモジュールなる不審物を発見。 | |
調査の結果、これが我軍の勝利に深刻な影響を及ぼす | |
危険因子であることが判明した。 | |
ST | |
mission: ~<<-MS | |
このモジュールをプロジェクトXより速やかに撤去し、 | |
その安全を確保することにある。 | |
MS | |
end | |
onetime :mission | |
private | |
def mission_template(name:, status:, mission:) | |
puts ~<<-MISSION | |
おはよう#{name}君。 | |
#{status} | |
そこで今回の君の使命だが、 | |
#{mission} | |
例によって、君もしくはメンバーが捕らえられ、 | |
あるいは殺されても当局はいっさい関知しないからそのつもりで。 | |
なお、このメソッドは自動的に消滅する。 | |
成功を祈る。 | |
MISSION | |
end | |
end | |
if __FILE__ == $0 | |
mi = MissionImpossible.new | |
mi.mission_exist? # => true | |
mi.mission("フェルプス") | |
mi.mission_exist? # => false | |
mi.mission("フェルプス") | |
end | |
# ~> -:58:in `<main>': undefined method `mission' for #<MissionImpossible:0x007fdc4909fd08> (NoMethodError) | |
# >> おはようフェルプス君。 | |
# >> | |
# >> 昨夜、プロジェクトX内において | |
# >> NullObjectモジュールなる不審物を発見。 | |
# >> 調査の結果、これが我軍の勝利に深刻な影響を及ぼす | |
# >> 危険因子であることが判明した。 | |
# >> | |
# >> そこで今回の君の使命だが、 | |
# >> このモジュールをプロジェクトXより速やかに撤去し、 | |
# >> その安全を確保することにある。 | |
# >> | |
# >> 例によって、君もしくはメンバーが捕らえられ、 | |
# >> あるいは殺されても当局はいっさい関知しないからそのつもりで。 | |
# >> | |
# >> なお、このメソッドは自動的に消滅する。 | |
# >> 成功を祈る。 | |
# >> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# building a method which can be called only onetime. | |
module OneTime | |
def onetime(method) | |
TracePoint.trace(:return) do |tp| | |
k, m = tp.defined_class, tp.method_id | |
if method == m | |
k.class_eval { undef_method m } | |
end | |
end | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment