Skip to content

Instantly share code, notes, and snippets.

@bruce
Created July 20, 2011 21:24
Show Gist options
  • Save bruce/1095972 to your computer and use it in GitHub Desktop.
Save bruce/1095972 to your computer and use it in GitHub Desktop.
An explicit plugin registry approach (instead of implicit descendant tracking)
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)
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