diff --git a/lib/dm-core/model.rb b/lib/dm-core/model.rb index f1227bbd..df751119 100644 --- a/lib/dm-core/model.rb +++ b/lib/dm-core/model.rb @@ -86,6 +86,12 @@ def self.descendants # @api semipublic def self.append_inclusions(*inclusions) extra_inclusions.concat inclusions + + # Add the inclusion to existing descendants + descendants.each do |model| + inclusions.each { |inclusion| model.send :include, inclusion } + end + true end @@ -111,6 +117,12 @@ def self.extra_inclusions # @api semipublic def self.append_extensions(*extensions) extra_extensions.concat extensions + + # Add the extension to existing descendants + descendants.each do |model| + extensions.each { |extension| model.extend(extension) } + end + true end diff --git a/spec/semipublic/model_spec.rb b/spec/semipublic/model_spec.rb new file mode 100644 index 00000000..79c8059d --- /dev/null +++ b/spec/semipublic/model_spec.rb @@ -0,0 +1,96 @@ +require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper')) + +describe DataMapper::Model do + + it { should respond_to(:append_inclusions) } + + describe '.append_inclusions' do + module ::Inclusions + def new_method + end + end + + describe 'before the model is defined' do + before :all do + DataMapper::Model.append_inclusions(Inclusions) + + class ::User + include DataMapper::Resource + property :id, Serial + end + end + + it 'should respond to :new_method' do + User.new.should respond_to(:new_method) + end + + after :all do + DataMapper::Model.extra_inclusions.delete(Inclusions) + end + end + + describe 'after the model is defined' do + before :all do + class ::User + include DataMapper::Resource + property :id, Serial + end + DataMapper::Model.append_inclusions(Inclusions) + end + + it 'should respond to :new_method' do + User.new.should respond_to(:new_method) + end + + after :all do + DataMapper::Model.extra_inclusions.delete(Inclusions) + end + end + end + + it { should respond_to(:append_extensions) } + + describe '.append_extensions' do + module ::Extensions + def new_method + end + end + + describe 'before the model is defined' do + before :all do + DataMapper::Model.append_extensions(Extensions) + + class ::User + include DataMapper::Resource + property :id, Serial + end + end + + it 'should respond to :new_method' do + User.should respond_to(:new_method) + end + + after :all do + DataMapper::Model.extra_extensions.delete(Extensions) + end + end + + describe 'after the model is defined' do + before :all do + class ::User + include DataMapper::Resource + property :id, Serial + end + DataMapper::Model.append_extensions(Extensions) + end + + it 'should respond to :new_method' do + User.should respond_to(:new_method) + end + + after :all do + DataMapper::Model.extra_extensions.delete(Extensions) + end + end + end +end