diff --git a/lib/curly.rb b/lib/curly.rb index 7f48e98..2f1f497 100644 --- a/lib/curly.rb +++ b/lib/curly.rb @@ -50,5 +50,6 @@ def self.valid?(template, presenter_class) require 'curly/compiler' require 'curly/presenter' +require 'curly/delegate_presenter' require 'curly/template_handler' require 'curly/railtie' if defined?(Rails) diff --git a/lib/curly/delegate_presenter.rb b/lib/curly/delegate_presenter.rb new file mode 100644 index 0000000..d516be9 --- /dev/null +++ b/lib/curly/delegate_presenter.rb @@ -0,0 +1,23 @@ +require 'curly/presenter' + +module Curly + class DelegatePresenter < Curly::Presenter + def self.delegates(*methods) + methods.each do |method| + class_eval <<-RUBY + def #{method} + @#{delegatee_name}.#{method} + end + RUBY + end + end + + def self.inherited(subclass) + self.presented_names += [subclass.delegatee_name] + end + + def self.delegatee_name + name.split("::").last.underscore.sub(/_presenter$/, "") + end + end +end diff --git a/spec/delegate_presenter_spec.rb b/spec/delegate_presenter_spec.rb new file mode 100644 index 0000000..e7f6fed --- /dev/null +++ b/spec/delegate_presenter_spec.rb @@ -0,0 +1,14 @@ +describe Curly::DelegatePresenter do + class PersonPresenter < Curly::DelegatePresenter + delegates :name, :age + end + + it "allows exposing methods on the passed object" do + context = double(:context) + person = double(:person, name: "Jane", age: 25) + presenter = PersonPresenter.new(context, person: person) + + expect(presenter.name).to eq "Jane" + expect(presenter.age).to eq 25 + end +end