Skip to content

Instantly share code, notes, and snippets.

@melborne
Created March 15, 2014 06:10
Show Gist options
  • Save melborne/9562475 to your computer and use it in GitHub Desktop.
Save melborne/9562475 to your computer and use it in GitHub Desktop.
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より速やかに撤去し、
# >> その安全を確保することにある。
# >>
# >> 例によって、君もしくはメンバーが捕らえられ、
# >> あるいは殺されても当局はいっさい関知しないからそのつもりで。
# >>
# >> なお、このメソッドは自動的に消滅する。
# >> 成功を祈る。
# >>
# 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