from observable import Observable from FlippR_Networking import Networking output_server_address = '' input_server_address = '' #network = Networking(output_server_address, input_server_address) network = '' class EventHandler(): def __init__(self, network): # brace yourselves, python incoming self.subclasses = {subcls.__name__: subcls for subcls in self.__class__.__subclasses__()} self.network = network def handle(self, name): self.subclasses[name](network) class LeftFlapEventHandler(EventHandler): def __init__(self, network): print('Left Flap Event gets handled') self.handle() def handle(self): # do stuff... pass class Bank(Target): def __init__(self, targets): self.targets = targets self.__register_targets__() def __target_hit__(self, target): if all(target.is_hit for target in self.targets): self.__all_targets_hit__() def __all_targets_hit__(self): self.__reset_all_targets__() super.hit() pass def __reset_all_targets__(self): for target in self.targets: target.reset() def __register_targets__(self): for target in self.targets: target.on(target.hit_key, self.__target_hit__) class Target(Observable):#is observable def __init__(self, points, name): self.points = points self.name = name self.hit_key = "hit" def hit(self): #notify Observers #notify Gamestate self.trigger(self.hit_key, self) class BankTarget(Target): def __init__(self, points): super(points) self.is_hit = False def hit(self): self.is_hit = True super.hit() #notify Bank def reset(self): self.is_hit = False class GameState: def __init__(self, targets): self.score = 0 self.targets = targets for target in self.targets: target.on(target.hit_key, self.__target_hit__) def __target_hit__(self, target): pass def snake_to_camel(word): return ''.join(x.capitalize() or '' for x in word.split('_')) handler = EventHandler(network) handler.handle(snake_to_camel('left_flap') + 'EventHandler') # while True: # event_name = snake_to_camel(network.getInputEvent()) # handler.handle(event_name + 'EventHandler')