123456789_123456789_123456789_123456789_123456789_

Module: Sinatra::Extension

Relationships & Source Files
Namespace Children
Classes:
Defined in: sinatra-contrib/lib/sinatra/extension.rb

Overview

Sinatra::Extension is a mixin that provides some syntactic sugar for your extensions. It allows you to call almost any Sinatra::Base method directly inside your extension module. This means you can use get to define a route, before to define a before filter, set to define a setting and so on.

Is important to be aware that this mixin remembers the method calls you make, and then, when your extension is registered, replays them on the ::Sinatra application that has been extended. In order to do that, it defines a registered method, so, if your extension defines one too, remember to call super.

Usage

Just require the mixin and extend your extension with it:

require 'sinatra/extension'

module MyExtension
  extend Sinatra::Extension

  # set some settings for development
  configure :development do
    set :reload_stuff, true
  end

  # define a route
  get '/' do
    'Hello World'
  end

  # The rest of your extension code goes here...
end

You can also create an extension with the .new method:

MyExtension = Sinatra::Extension.new do
  # Your extension code goes here...
end

This is useful when you just want to pass a block to Sinatra::Base.register.

Class Method Summary

Instance Method Summary

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method, *args, &block) (private)

[ GitHub ]

  
# File 'sinatra-contrib/lib/sinatra/extension.rb', line 83

def method_missing(method, *args, &block)
  return super unless Sinatra::Base.respond_to? method

  record(method, *args, &block)
  DontCall.new(method)
end

Class Method Details

.new(&block)

[ GitHub ]

  
# File 'sinatra-contrib/lib/sinatra/extension.rb', line 51

def self.new(&block)
  ext = Module.new.extend(self)
  ext.class_eval(&block)
  ext
end

Instance Method Details

#configure(*args, &block)

[ GitHub ]

  
# File 'sinatra-contrib/lib/sinatra/extension.rb', line 61

def configure(*args, &block)
  record(:configure, *args) { |c| c.instance_exec(c, &block) }
end

#record(method, *args, &block) (private)

[ GitHub ]

  
# File 'sinatra-contrib/lib/sinatra/extension.rb', line 71

def record(method, *args, &block)
  recorded_methods << [method, args, block]
end

#recorded_methods (private)

[ GitHub ]

  
# File 'sinatra-contrib/lib/sinatra/extension.rb', line 79

def recorded_methods
  @recorded_methods ||= []
end

#registered(base = nil, &block)

[ GitHub ]

  
# File 'sinatra-contrib/lib/sinatra/extension.rb', line 65

def registered(base = nil, &block)
  base ? replay(base) : record(:class_eval, &block)
end

#replay(object) (private)

[ GitHub ]

  
# File 'sinatra-contrib/lib/sinatra/extension.rb', line 75

def replay(object)
  recorded_methods.each { |m, a, b| object.send(m, *a, &b) }
end

#settings

[ GitHub ]

  
# File 'sinatra-contrib/lib/sinatra/extension.rb', line 57

def settings
  self
end