Module: Prawn::View
- Defined in:
- lib/prawn/view.rb
Overview
This mixin allows you to create modular Prawn code without the need to create subclasses of Document.
class Greeter
include Prawn::View
# Optional override: allows you to set document options or even use
# a custom document class
def document
@document ||= Prawn::Document.new(page_size: 'A4')
end
def initialize(name)
@name = name
end
def say_hello
text "Hello, #{@name}!"
end
def say_goodbye
font("Courier") do
text "Goodbye, #{@name}!"
end
end
end
greeter = Greeter.new("Gregory")
greeter.say_hello
greeter.say_goodbye
greeter.save_as("greetings.pdf")
The short story about why you should use this mixin rather than creating
subclasses of Prawn::Document
is that it helps prevent accidental
conflicts between your code and Prawn’s code.
Here’s the slightly longer story…
By using composition rather than inheritance under the hood, this mixin
allows you to keep your state separate from Prawn::Document
’s state, and
also will prevent unexpected method name collisions due to late binding
effects.
This mixin is mostly meant for extending Prawn’s functionality with your own
additions, but you can also use it to replace or wrap existing Prawn
methods. Calling super
will still work as expected, and alternatively you
can explicitly call document.some_method
to delegate to Prawn where
needed.
Experimental API collapse
-
#document ⇒ Prawn::Dcoument
Lazily instantiates a
Prawn::Document
object. -
#method_missing(method_name, *args, **kwargs, &block) ⇒ Object
Delegates all unhandled calls to object returned by #document method.
-
#respond_to_missing?(method_name, _include_all = false) ⇒ Boolean
Does this object respond to the specified message?.
-
#save_as(filename) ⇒ void
Syntatic sugar that calls
document.render_file
under the hood. -
#update { ... } ⇒ void
Syntactic sugar that uses
instance_eval
under the hood to provide a block-based DSL.
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(method_name, *args, **kwargs, &block) ⇒ Object
Delegates all unhandled calls to object returned by #document method.
Source Code
75 | def method_missing(method_name, *args, **kwargs, &block) |
76 | return super unless document.respond_to?(method_name) |
77 | |
78 | document.public_send(method_name, *args, **kwargs, &block) |
79 | end
|
Instance Method Details
#document ⇒ Prawn::Dcoument
Lazily instantiates a Prawn::Document
object.
You can also redefine this method in your own classes to use a custom document class.
Source Code
65 | def document |
66 | @document ||= Prawn::Document.new |
67 | end
|
#respond_to_missing?(method_name, _include_all = false) ⇒ Boolean
Does this object respond to the specified message?
Source Code
86 | def respond_to_missing?(method_name, _include_all = false) |
87 | document.respond_to?(method_name) || super |
88 | end
|
#save_as(filename) ⇒ void
This method returns an undefined value.
Syntatic sugar that calls document.render_file
under the hood.
Source Code
112 | def save_as(filename) |
113 | document.render_file(filename) |
114 | end
|
#update { ... } ⇒ void
This method returns an undefined value.
Syntactic sugar that uses instance_eval
under the hood to provide
a block-based DSL.
Source Code
101 | def update(&block) |
102 | instance_eval(&block) |
103 | end
|