Created
July 20, 2011 21:24
-
-
Save bruce/1095972 to your computer and use it in GitHub Desktop.
An explicit plugin registry approach (instead of implicit descendant tracking)
This file contains hidden or 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
class Handler | |
def self.handles(ext = nil, &block) | |
if ext | |
check = -> (file) { File.extname(file.path) == ".#{ext}" } | |
else | |
check = block | |
end | |
Handler.registry[check] = self | |
end | |
def self.registry | |
@registry ||= {} | |
end | |
def self.handlers | |
registry.values | |
end | |
def self.handler_for(file) | |
registry.each do |check, handler| | |
return handler if check.(file) | |
end | |
nil | |
end | |
def self.process(file) | |
handler = handler_for(file) | |
if handler | |
handler.new(file).process | |
else | |
nil | |
end | |
end | |
def initialize(file) | |
@file = file | |
end | |
# Abstract; override | |
def process | |
end | |
end | |
class PDFHandler < Handler | |
handles :pdf | |
end | |
class SmallMovieHandler < Handler | |
handles do |file| | |
File.extname(file) == '.mov' && File.size(file) < 1024 | |
end | |
end | |
result = Handler.process(some_file) |
This file contains hidden or 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
class Plugin | |
def self.register(name) | |
Plugin.registry[name] = self | |
end | |
def self.registry | |
@registry ||= {} | |
end | |
def self.plugins | |
registry.values | |
end | |
def self.lookup(name) | |
registry[name] | |
end | |
end | |
# Not registered (abstract) | |
class Formatter < Plugin | |
end | |
class PDFFormatter < Formatter | |
register :pdf_formatter | |
end | |
class PlainPlugin < Plugin | |
register :plain | |
end | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment