# A basic plugin for Discourse. Meant to be extended and filled in. # Most work is delegated to a registry. class DiscoursePlugin attr_reader :registry def initialize(registry) @registry = registry end def setup # Initialize the plugin here end # Loads and mixes in the plugin's mixins into the host app's classes. # A mixin named "UserMixin" will be included into the "User" class. def self.include_mixins mixins.each do |mixin| original_class = mixin.to_s.demodulize.sub("Mixin", "") dependency_file_name = original_class.underscore require_dependency(dependency_file_name) original_class.constantize.send(:include, mixin) end end # Find the modules defined in the plugin with "Mixin" in their name. def self.mixins constants.map { |const_name| const_get(const_name) } .select { |const| const.class == Module && const.name["Mixin"] } end def register_js(file, opts = {}) @registry.register_js(file, opts) end def register_css(file) @registry.register_css(file) end def register_archetype(name, options = {}) @registry.register_archetype(name, options) end def listen_for(event_name) return unless self.respond_to?(event_name) DiscourseEvent.on(event_name, &self.method(event_name)) end end