diff --git a/lib/cancan/ability.rb b/lib/cancan/ability.rb
index <HASH>..<HASH> 100644
--- a/lib/cancan/ability.rb
+++ b/lib/cancan/ability.rb
@@ -283,9 +283,9 @@ module CanCan
 
     protected
 
-    def rules
-      @rules
-    end
+    # Must be protected as an ability can merge with other abilities.
+    # This means that an ability must expose their rules with another ability.
+    attr_reader :rules
 
     private
 
@@ -356,8 +356,7 @@ module CanCan
 
     def alternative_subjects(subject)
       subject = subject.class unless subject.is_a?(Module)
-      descendants = []
-      [:all, *subject.ancestors, *descendants, subject.class.to_s]
+      [:all, *subject.ancestors,  subject.class.to_s]
     end
 
     # Returns an array of Rule instances which match the action and subject
Minor ability cleanup.

decendants in the alternative_subjects methods will never not be an
empty array. We can remove this statement.

Make rules an attr_reader and add a bit of documentations as to why it
needs to be protected, as this is one of the -few- cases in ruby where
it makes sense for it to be so.