# \#append\_features deprecated?

**URL:** <https://www.ruby-forum.com/t/append-features-deprecated/51860>\
**Category:** Ruby\
**Created:** [December 3, 2005, 2:25pm UTC](https://www.ruby-forum.com/t/append-features-deprecated/51860 "2005-12-03T14:25:48Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![transfire](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@transfire](https://www.ruby-forum.com/u/transfire)\
**Post date:** [December 3, 2005, 2:25pm UTC](https://www.ruby-forum.com/t/append-features-deprecated/51860/1 "2005-12-03T14:25:48Z")

</div>

Somone else mentioned this. Is it true?

Thanks,  
T.

---

<div class="post-metadata">

**Author:** ![transfire](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@transfire](https://www.ruby-forum.com/u/transfire)\
**Post date:** [December 3, 2005, 2:48pm UTC](https://www.ruby-forum.com/t/append-features-deprecated/51860/2 "2005-12-03T14:48:21Z")

</div>

Trans wrote:

> Somone else mentioned this. Is it true?

This says Module#included " should be used in preference to  
Module.append\_features if your code wants to perform some action when a  
module is included in another."

[http://www.ruby-doc.org/core/classes/Module.html#M000704](http://www.ruby-doc.org/core/classes/Module.html#M000704)

Cheers,  
Dave

---

<div class="post-metadata">

**Author:** ![transfire](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@transfire](https://www.ruby-forum.com/u/transfire)\
**Post date:** [December 3, 2005, 4:43pm UTC](https://www.ruby-forum.com/t/append-features-deprecated/51860/3 "2005-12-03T16:43:49Z")

</div>

Dave B. wrote:

> Dave  
> module M  
> def self.included(klass)  
> puts “Included in #{klass}”  
> end  
> end

class A  
include M # -\> Included in A  
end

class B  
M.append\_features(self) # Nothing  
end

As you can see, Module#append\_features doesn’t call the .included method  
on the module, include does.

Cheers,  
Daniel

---

<div class="post-metadata">

**Author:** ![transfire](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@transfire](https://www.ruby-forum.com/u/transfire)\
**Post date:** [December 3, 2005, 5:04pm UTC](https://www.ruby-forum.com/t/append-features-deprecated/51860/4 "2005-12-03T17:04:08Z")

</div>

Daniel S. wrote:

> > Cheers,  
> > end  
> > Daniel  
> > Oooops, #append\_features is private, so it should be

M.send :append\_features, self

Cheers,  
Daniel

---

<div class="post-metadata">

**Author:** ![transfire](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@transfire](https://www.ruby-forum.com/u/transfire)\
**Post date:** [December 3, 2005, 6:13pm UTC](https://www.ruby-forum.com/t/append-features-deprecated/51860/5 "2005-12-03T18:13:13Z")

</div>

ts wrote:

> def self.included(klass)
> 
> module M  
> end  
> Guy Decoux  
> Um, yeah. `append_features' does the actual work (appending the methods of a module to a class/module),`include’ just calls `append_features' and then`included’.

class Module  
def include(\*mods)  
mods.each do |mod|  
mod.append\_features(self)  
mod.included(self)  
end  
end  
end

Cheers,  
Daniel

---

<div class="post-metadata">

**Author:** ![transfire](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@transfire](https://www.ruby-forum.com/u/transfire)\
**Post date:** [December 3, 2005, 6:21pm UTC](https://www.ruby-forum.com/t/append-features-deprecated/51860/6 "2005-12-03T18:21:22Z")

</div>

> > > > > “D” == Daniel S. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) writes:

D\> Um, yeah. `append_features' does the actual work (appending the methods D> of a module to a class/module), `include’ just calls  
`append_features' D> and then `included’.

yes, and this is why you must call super in #append\_features (if you  
redefine it) otherwise ruby don’t include the module.

Guy Decoux

---

<div class="post-metadata">

**Author:** ![transfire](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@transfire](https://www.ruby-forum.com/u/transfire)\
**Post date:** [December 3, 2005, 7:38pm UTC](https://www.ruby-forum.com/t/append-features-deprecated/51860/7 "2005-12-03T19:38:43Z")

</div>

ts wrote:

> > > > > > “D” == Daniel S. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) writes:
> 
> D\> Um, yeah. `append_features' does the actual work (appending the methods D> of a module to a class/module), `include’ just calls `append_features' D> and then `included’.
> 
> yes, and this is why you must call super in #append\_features (if you  
> redefine it) otherwise ruby don’t include the module.
> 
> Guy Decoux

Yup.

---

<div class="post-metadata">

**Author:** ![transfire](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@transfire](https://www.ruby-forum.com/u/transfire)\
**Post date:** [December 3, 2005, 4:51pm UTC](https://www.ruby-forum.com/t/append-features-deprecated/51860/8 "2005-12-03T16:51:54Z")

</div>

> > > > > “D” == Daniel S. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) writes:

D\> As you can see, Module#append\_features doesn’t call the .included  
method  
D\> on the module, include does.

Well, it’s best to see it like this :

moulon% cat b.rb  
#!/usr/bin/ruby  
module M  
def self.included(klass)  
puts “Included in #{klass}”  
end  
def a  
puts “a”  
end  
end

class A  
include M  
end

A.new.a  
moulon%

moulon% ./b.rb  
Included in A  
a  
moulon%

moulon% cat b.rb  
#!/usr/bin/ruby  
module M  
def self.append\_features(klass)  
puts “Included in #{klass}”  
end  
def a  
puts “a”  
end  
end

class A  
include M  
end

A.new.a  
moulon%

moulon% ./b.rb  
Included in A  
./b.rb:15: undefined method `a’ for #\<A:0xb7d64b38\> (NoMethodError)  
moulon%

Guy Decoux

---

<div class="post-metadata">

**Author:** ![transfire](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@transfire](https://www.ruby-forum.com/u/transfire)\
**Post date:** [December 3, 2005, 10:14pm UTC](https://www.ruby-forum.com/t/append-features-deprecated/51860/9 "2005-12-03T22:14:54Z")

</div>

Daniel S. wrote:

> ```
> end
> end
> 
> ```
> 
> end

It does? Looking at the C code it seems a lot more complicated then  
that.

T.
