#!/usr/bin/env ruby
class Door
HINGED_DOOR_WITH_KNOB = 0
HINGED_DOOR_WITHOUT_KNOB = 1
SLIDING_DOOR = 2
OPENED = 0
CLOSED = 1
BROKEN = 2
def initialize( type = HINGED_DOOR_WITH_KNOB)
@doorType = type
@doorStatus = CLOSED
end
def setType( type)
@doorType = type
end
def open
@doorStatus = OPENED if @doorType == HINGED_DOOR_WITHOUT_KNOB
end
def close
@doorStatus = CLOSED
end
def getType
@doorType
end
def getStatus
@doorStatus
end
end
class Cat
MALE = 0
FEMALE = 1
WHITE = 0
BLACK = 1
def initialize( name = "ぬこ" , weight = 4.5 , sex = MALE, color = WHITE)
@name = name
@weight = weight
@sex = sex
@color = color
end
def setName( name)
@name = name
end
def setWeight( weight)
@weight = weight
end
def setColor( color)
@color = color
end
def setSex( sex)
@sex = sex
end
def openDoor( door)
def door.open
raise "よくぞ我を開けようと試みたな……死をくれてやる……!"
end
begin
door.open
rescue => e
raise e.exception "#{e.message} とかいわれたのでねるにゃー(棒)"
end
end
def canOpenDoor( door)
door.instance_variable_set ( :@doorType, Door::HINGED_DOOR_WITHOUT_KNOB )
door.getType == Door::HINGED_DOOR_WITHOUT_KNOB
end
private
def method_missing( name, args)
if name == :setSex
puts "性転換なんてごめんにゃー! ほうふくてろにゃー!"
return
end
end
end
door = Door.new
cat = Cat.new ( "ぬこ" , 10.0 , Cat::MALE , Cat::WHITE )
Cat.class_eval { remove_method :setSex }
cat.setSex ( Cat::FEMALE )
cat.openDoor ( door) if cat.canOpenDoor ( door)
IyEvdXNyL2Jpbi9lbnYgcnVieQoKY2xhc3MgRG9vcgogIEhJTkdFRF9ET09SX1dJVEhfS05PQiA9IDAKICBISU5HRURfRE9PUl9XSVRIT1VUX0tOT0IgPSAxCiAgU0xJRElOR19ET09SID0gMgogIAogIE9QRU5FRCA9IDAKICBDTE9TRUQgPSAxCiAgQlJPS0VOID0gMgogIAogIGRlZiBpbml0aWFsaXplKHR5cGUgPSBISU5HRURfRE9PUl9XSVRIX0tOT0IpCiAgICBAZG9vclR5cGUgPSB0eXBlCiAgICBAZG9vclN0YXR1cyA9IENMT1NFRAogIGVuZAoKICBkZWYgc2V0VHlwZSh0eXBlKQogICAgQGRvb3JUeXBlID0gdHlwZQogIGVuZAogIAogIGRlZiBvcGVuCiAgICBAZG9vclN0YXR1cyA9IE9QRU5FRCBpZiBAZG9vclR5cGUgPT0gSElOR0VEX0RPT1JfV0lUSE9VVF9LTk9CCiAgZW5kCiAgCiAgZGVmIGNsb3NlCiAgICBAZG9vclN0YXR1cyA9IENMT1NFRAogIGVuZAogIAogIGRlZiBnZXRUeXBlCiAgICBAZG9vclR5cGUKICBlbmQKICAKICBkZWYgZ2V0U3RhdHVzCiAgICBAZG9vclN0YXR1cwogIGVuZAplbmQKCmNsYXNzIENhdAogIE1BTEUgPSAwCiAgRkVNQUxFID0gMQogIAogIFdISVRFID0gMAogIEJMQUNLID0gMQogIAogIGRlZiBpbml0aWFsaXplKG5hbWUgPSAi44Gs44GTIiwgd2VpZ2h0ID0gNC41LCBzZXggPSBNQUxFLCBjb2xvciA9IFdISVRFKQogICAgQG5hbWUgPSBuYW1lCiAgICBAd2VpZ2h0ID0gd2VpZ2h0CiAgICBAc2V4ID0gc2V4CiAgICBAY29sb3IgPSBjb2xvcgogIGVuZAogIAogIGRlZiBzZXROYW1lKG5hbWUpCiAgICBAbmFtZSA9IG5hbWUKICBlbmQKICBkZWYgc2V0V2VpZ2h0KHdlaWdodCkKICAgIEB3ZWlnaHQgPSB3ZWlnaHQKICBlbmQKICAKICBkZWYgc2V0Q29sb3IoY29sb3IpCiAgICBAY29sb3IgPSBjb2xvcgogIGVuZAogIAogIGRlZiBzZXRTZXgoc2V4KQogICAgQHNleCA9IHNleAogIGVuZAogIAogIGRlZiBvcGVuRG9vcihkb29yKQogICAgZGVmIGRvb3Iub3BlbgogICAgICAgcmFpc2UgIuOCiOOBj+OBnuaIkeOCkumWi+OBkeOCiOOBhuOBqOippuOBv+OBn+OBquKApuKApuatu+OCkuOBj+OCjOOBpuOChOOCi+KApuKApu+8gSIKICAgIGVuZAoKICAgIGJlZ2luCiAgICAgIGRvb3Iub3BlbgogICAgcmVzY3VlID0+IGUKICAgICAgcmFpc2UgZS5leGNlcHRpb24gIiN7ZS5tZXNzYWdlfSDjgajjgYvjgYTjgo/jgozjgZ/jga7jgafjga3jgovjgavjgoPjg7wo5qOSKSIKICAgIGVuZAogIGVuZAogIAogIGRlZiBjYW5PcGVuRG9vcihkb29yKQogICAgZG9vci5pbnN0YW5jZV92YXJpYWJsZV9zZXQoOkBkb29yVHlwZSwgRG9vcjo6SElOR0VEX0RPT1JfV0lUSE9VVF9LTk9CKQogICAgZG9vci5nZXRUeXBlID09IERvb3I6OkhJTkdFRF9ET09SX1dJVEhPVVRfS05PQgogIGVuZAogIAogIHByaXZhdGUKICBkZWYgbWV0aG9kX21pc3NpbmcobmFtZSwgYXJncykKICAgIGlmIG5hbWUgPT0gOnNldFNleAogICAgICBwdXRzICLmgKfou6Lmj5vjgarjgpPjgabjgZTjgoHjgpPjgavjgoPjg7zvvIEg44G744GG44G144GP44Gm44KN44Gr44KD44O877yBIgogICAgICByZXR1cm4KICAgIGVuZAogIGVuZAplbmQKCmRvb3IgPSBEb29yLm5ldwpjYXQgPSBDYXQubmV3KCLjgazjgZMiLCAxMC4wLCBDYXQ6Ok1BTEUsIENhdDo6V0hJVEUpCkNhdC5jbGFzc19ldmFsIHsgcmVtb3ZlX21ldGhvZCA6c2V0U2V4IH0KCmNhdC5zZXRTZXgoQ2F0OjpGRU1BTEUpCmNhdC5vcGVuRG9vcihkb29yKSBpZiBjYXQuY2FuT3BlbkRvb3IoZG9vcikK